js有序数组唯一化

254 阅读1分钟

思路

定义两个指针i,j,迭代这个数组,每次迭代j++;
i初始指向0,迭代时[0,i]始终是不重复的元素,j指向当前迭代的元素;
每次迭代比较第i个元素与第j个元素是否相同;
若不相同则将第j个赋值给第i+1个,因为第[0,i]都是不重复的,此时第[0,i+1]个也都是不重复的了;
若相同则进行下一轮迭代;
直到j指向超出数组的最后一个元素;
最后我们返回[0,i+1]都是不重复的,而j-i+1是所有多余的重复元素的个数。

代码

function toOnly(arr) {
    let i = 0,j=1
    while (j<arr.length){
        if(arr[i]!=arr[j]){
            arr[++i] = arr[j]
        }
        j++
    }
    return arr.slice(0,i+1)
}

优点

此算法的循环次数和常规的去重没有两样,但其对重复元素位移操作减少了。