for (var i=a.length-1;i>0;i--) {
if (i!=a.indexOf(a.charAt(i))) {
a=a.substring(0,i)+a.substring(i+1);
}
}
我在一个我正在审核的网络应用程序中找到了这个,它让我感到困惑,为什么它在那里。
我似乎无法看到i!=a.indexOf(a.charAt(i))
错误的情况。
传递给它的值是:
a = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
没有评论//叹气
答案 0 :(得分:7)
对于重复的字符,情况也是如此,因为indexOf
找到字符串的第一个索引,并且您正在搜索结尾。例如:
var a = "xyzxyz";
在第一次迭代时,i === 4
,a.charAt(4) === "x"
和a.indexOf("x") === 0
。所以4 !== 0
。
然后设置a = a.substring(0, 4) + a.substring(5)
。回忆substring
包含在第一个索引中,但在最后一个索引中是独占的,这意味着在这种情况下a = "xyz" + "yz"
,因此我们从字符串中删除了重复的"x"
。
由于循环向后遍历,即使对于重复多次的字符,这仍将继续有效;您可以看到,a.substring(i + 1)
部分将始终已被算法覆盖,即不包含任何重复项。
与往常一样,遇到这种类型的东西时,应用提取方法重构将是使代码更清晰的好方法。 (甚至比评论它更好!)所以如果你把它拉到一个方法中,代码就会变成a = removeDuplicateChars(a)
,每个人都会更开心。