如何从数组中删除重复的数字?
Posted
技术标签:
【中文标题】如何从数组中删除重复的数字?【英文标题】:How to remove repeated number from an array? 【发布时间】:2022-01-10 13:59:18 【问题描述】:如何彻底去除数组中的重复数字?
例如,如果:
const array = [1, 1, 2, 3, 1, 2, 5]
输出应该是:
[3, 5]
【问题讨论】:
如果它是一个排序数组,它可以在 O(1) 空间复杂度内完成。否则你必须采取一个集合来检查元素 【参考方案1】:您可以获取一个对象来跟踪看到的项目,方法是获取一个包含值的数组或将数组值设置为零。
最后将结果集扁平化以移除空数组。
const
array = [1, 1, 2, 3, 1, 2, 5],
result = array
.reduce((o => (r, v) =>
if (v in o) o[v].length = 0;
else r.push(o[v] = [v]);
return r;
)(), [])
.flat();
console.log(result);
【讨论】:
这是一个聪明的方法,它不需要显式地进行计数。【参考方案2】:Roko 和 Ke1vans 以函数式方法给出了答案。两者都是正确的。但是,我会以命令式的方式给出答案,这对于新手来说似乎更容易。
类似于他们的流程。首先,我们计算每个数字的出现次数。然后我们将出现一次(因此不重复)的数字选择到输出数组中。
let array = [1,1,2,3,1,2,5]
let counts =
let output = []
// loop each elements in the array as `item`
for(let item of array)
// If the item is not set in the counts, `counts[item]` will be `undefined`.
// Using `|| 0` means use zero as fallback value if the items is unseen.
let count = counts[item] || 0
counts[item] = count + 1
// loop each keys in the object (key-value pairs) as `item`
for(let item in counts)
let count = counts[item]
if(count == 1)
// `+item` converts the key from string into number
output.push(+item)
console.log(output) // will print out `[ 3, 5 ]`
【讨论】:
【参考方案3】:您可以迭代并创建值映射。稍后迭代和过滤。
const data = [1, 1, 2, 3, 1, 2, 5];
const findUniques = (data = []) =>
const map = data.reduce((m, num) =>
m[num] = (m[num] || 0) + 1;
return m;
, );
return data.filter((num) => map[num] === 1);
;
console.log(findUniques(data));
您也可以使用 2 个集合或 2 个数组来做同样的事情。
const data = [1, 1, 2, 3, 1, 2, 5];
const findUniques2 = (data = []) =>
let unique = new Set();
let seen = new Set();
for (let num of data)
if (seen.has(num)) unique.delete(num);
else unique.add(num);
seen.add(num);
return Array.from(unique);
;
console.log(findUniques2(data));
【讨论】:
【参考方案4】:使用一个对象,其中键是数字,值是出现的次数。比将其还原为所需的值数组:
const arr = [1,1,2,3,1,2,5];
const res = Object.entries(arr.reduce((ob, v) =>
if (!(v in ob)) ob[v] = 0;
ob[v] += 1; // Count occurrences
return ob;
, )).reduce((arr, [k, v]) => // Reduce back to Array
if (v === 1) arr.push(+k); // Only keys with 1 occurrence
return arr;
, []);
console.log(res); // [3, 5]
【讨论】:
【参考方案5】:您可以为此 使用 Array.filter() (Array filter article) 示例:
const a = [ 1 , 1 , 2 , 3 , 2 , 4 , 5 , 7];
function filter(value , index , array)
// looping through all the objects in the array
for(let i=0; i<array.length; i++)
if(i != index && array[i] == value) return false; // return 'false' if the value has a duplicate other than itself
// return 'TRUE' if value hasn't been duplicated
return true;
const b = a.filter(filter); // [3, 4, 5, 7]
如果这个函数只使用一次,那么简短的版本:
const a = [ 1 , 1 , 2 , 3 , 2 , 4 , 5 , 7];
const b = a.filter((value , index , array) =>
for(let i=0; i<array.length; i++) if(i != index && array[i] == value) return false;
return true;
);
// [3, 4, 5, 7]
【讨论】:
【参考方案6】:您可以找到重复项,然后操作差异。
let a = [1,1,2,3,1,2,5];
const findDuplicates = (nums) =>
nums.sort(); // alters original array
let ans = []
for(let i = 0; i< nums.length; i++)
if(nums[i] === nums[i+1])
if(ans[ans.length -1] !== nums[i])
ans.push(nums[i])
return ans;
duplicates = new Set(findDuplicates(a))
let difference = new Set([...a].filter(x => !duplicates.has(x)))
console.log(Array.from(difference))
输出:[3, 5]
注意:我从 link 获取 findDuplicates 函数
【讨论】:
【参考方案7】:const data = [1, 1, 2, 3, 1, 2, 5];
const s = new Set();
const res = data.filter((a, i) =>
if (data.lastIndexOf(a) > i || s.has(a))
s.add(a);
return false;
return true;
);
console.log(res); //=> [3, 5]
【讨论】:
以上是关于如何从数组中删除重复的数字?的主要内容,如果未能解决你的问题,请参考以下文章