【发布时间】:2012-03-10 10:56:03
【问题描述】:
万一你错过了,问题是关于删除 sorted 数组上的重复项。可以应用非常快速的算法(与未排序的数组相比)来删除重复项。
- 如果您已经知道如何在 SORTED 数组上删除重复项,则可以跳过此步骤
示例:
var out=[];
for(var i=0,len=arr.length-1;i<len;i++){
if(arr[i]!==arr[i+1]){
out.push(arr[i]);
}
}
out.push(arr[i]);
看到了吗?速度非常快。我会尽力解释刚刚发生的事情。
排序后的数组*可能如下所示:
arr=[0,1,1,2,2,3,4,5,5,6,7,7,8,9,9,9];
*排序可以是 ASC 或 DESC,也可以是其他奇怪的方法,但重要的是每个重复的项目都彼此相邻。
我们停在array.length-1,因为我们没有任何东西要检查
然后我们不顾一切地添加了最后一个元素,因为:
案例A:
... ,9,9,9];//we have dup(s) on the left of the last element
案例 B:
... ,7,9,10];//we don't have dup(s) on the left of the last element
如果您真的了解发生了什么,您就会知道我们没有在案例 A 上添加任何 9。因此,无论我们是在案例 A 上还是在案例 A 上,我们都希望添加最后一个元素B.
问题:
也就是说,我也想做同样的事情,但在以下情况下忽略 undefined 值:
var arr=[];arr[99]=1;//0 through 98 are undefined, but do NOT hold the undefined value
我想删除那些。如果我有一些真实的undefined 值,则不应删除这些值。
我糟糕的尝试是这个:
var out=[];
for (var i=0,len=arr.length; i < len - 1;) {
var x = false;
var y = false;
for (var j = i, jo; j < len - 1; j++) {
if (j in arr) {
x = true;
jo = arr[j];
i = j + 1;
break;
}
}
if (x == false) {
break;
}
for (var u = i, yo; u < len - 1; u++) {
if (u in arr) {
y = true;
yo = arr[u];
i = u + 1;
break;
}
}
if (y == false) {
out.push(jo);
break;
}
if (jo !== yo) {
out.push(jo);
}
}
out.push(arr[len - 1]);
我真的迷路了,感谢任何帮助
【问题讨论】:
-
你想要什么行为?你只是想忽略数组中不存在的部分,还是什么?
-
@peter 我想删除 dups,即使之间有未定义
-
我认为您应该将初始数组打包到一个临时数组中(删除未定义的值)并使用它进行重复检查..
标签: javascript arrays duplicates duplicate-removal sorted