这里的数组是基本数据类型组成的数组,如nums = [0, 0, 5, 9, 1, 1, 1, 2, 12, 2, 3, 3, 4]
在不改变原数组的情况下:
1.最基本的去重方法
思路:定义一个新数组,并存放原数组的第一个元素,然后将元素组一一和新数组的元素对比,若不同则存放在新数组中。
function removeDuplicates(arr) {
const res = [arr[0]], len = arr.length
let i = 1
for (; i < len; i++) {
const len2 = res.length
let repeat = false, j = 0
for (; j < len2; j++) {
if (arr[i] === res[j]) {
repeat = true
break
}
}
if (!repeat) {
res.push(arr[i])
}
}
return res
}
1.先排序再去重
思路:先将原数组排序,在与相邻的进行比较,如果不同则存入新数组。
function removeDuplicates(arr) {
// sort方法对数组成员进行排序,默认是按照字典顺序排序。排序后,原数组将被改变。
const arr2 = [...arr].sort(), res = [arr2[0]], len = arr2.length
let i = 1
for (; i < len; i++) {
if (arr2[i] !== res[res.length - 1]) {
res.push(arr2[i])
}
}
return res
}
3.利用对象的属性去重(推荐)
思路:每次取出原数组的元素,然后在对象中访问这个属性,如果存在就说明重复。
function removeDuplicates(arr) {
const arrObj = {}, len = arr.length
let i = 0
for (; i < len; i++) {
if (!arrObj[arr[i]]) {
arrObj[arr[i]] = arr[i] + '' // 转换成string,方便上行if判断
}
}
return Object.keys(arrObj).map(it => +it)
}
3.利用下标查询
思路:每次取出原数组的元素,在新数组上使用indexOf查询下标,如果>=0就说明重复。
function unique(arr) {
const res = [arr[0]], len = arr.length
let i = 1
for (; i < len; i++) {
if (res.indexOf(arr[i]) === -1) {
res.push(arr[i])
}
}
return res
}
5.利用 form new Set ()
思路:ES6 提供了新的数据结构 Set
。它类似于数组,但是成员的值都是唯一的,没有重复的值。Set
本身是一个构造函数,用来生成 Set
数据结构(new Set()
)。Set
函数可以接受一个数组(或者具有 iterable 接口的其他数据结构)作为参数,用来初始化。
function unique(arr) {
return Array.from(new Set(arr))
}
6.运用扩展运算符
扩展运算符用三个点号(…)表示,功能是把数组或类数组对象展开成一系列用逗号隔开的值,它是rest的逆运算,rest的功能是把逗号隔开的值序列组合成一个数组。
function unique(arr) {
return [...new Set(arr)]
}
在只能改变原数组的情况下:
曾刷到一个题
这里是只能在nums数组操作的,并且返回的必须是nums数组的length,本质也是数字去重
1.本人菜鸟解法
// 执行时间320ms
function removeDuplicates(nums: number[]): number {
let unique = []
for (let i = nums.length - 1; i >= 0; i--) {
const current = nums[i]
if (unique.includes(current)) {
nums.splice(i, 1)
} else {
unique.push(current)
}
}
return nums.length
};
2.队友解法
// 执行时间80ms
function removeDuplicates(nums: number[]): number {
let i = 0, j = 1, len = nums.length
for (; j < len; j++) {
const current = nums[i], next = nums[j]
if (current !== next) nums[++i] = next
}
nums.splice(i + 1)
return i + 1
};
So,算法之路道阻且长。