我已经被困在这个问题上几个小时了,但没有取得任何进展。我觉得这应该很简单。我试图删除字符串中的重复字符,而不使用像Filter或Reg ex。
这样的方法这是我目前的代码:
var duplicate = function(string) {
var newString = string.split("");
var finalArrayWithNoDuplicates = []
for (var i = 0; i < newString.length; i++){
for (var=0; j < newString.length; i++){
while(newString[i])
if (newString[i] !== newString[j]){
}
}
}
return finalArrayWithNoDuplicates.join("");
};
我能够一次过滤一个字母,但随着我在while语句中向下进展,我正在添加最初过滤掉的字母。
这个算法的所有算法教程都是我发现的Java语言。有没有办法只使用for和while循环来做到这一点?
答案 0 :(得分:1)
建议的代码存在一些问题:
这是使用for循环和相同基本思想的替代版本:
function deduplicate(str) {
var result = "";
for (var i = 0; i < str.length; ++i) {
var found = false;
for (var j = 0; j < i; ++j) {
if (str[i] == str[j]) {
found = true;
break;
}
}
if (!found) result += str[i];
}
return result;
}
将输入字符串中的每个字符str[i]
与其前面的所有字符str[j]
进行比较(与跟随它的字符相比没有意义,因为我们将在轮到它们时处理这些字符无论如何)。如果角色不等于其前面的任何角色,那么我们知道它是第一个出现并将其包含在结果中的角色。
请注意,此算法具有O(n²)性能,与其他可能的方法相比,这种性能非常差。它的主要卖点是它很简单,一切都“发生在你眼前”。
答案 1 :(得分:0)
这是一个稍微修改过的函数版本,它使用一个对象来跟踪已遇到的字母:
var duplicate = function(string) {
var finalArrayWithNoDuplicates = [];
var seen = {};
for (var i = 0; i < string.length; i++) {
if (!seen[string[i]]) {
finalArrayWithNoDuplicates.push(string[i]);
seen[string[i]] = 1;
}
}
return finalArrayWithNoDuplicates.join("");
};
答案 2 :(得分:0)
for (var=0; j < newString.length; i++){
第一个是var=0
(编译错误),第二个是你增加i
而不是j
< / LI>
finalArrayWithNoDuplicates
添加唯一元素(不会出现两次)来完成如下:
var duplicate = function(newString) {
var finalArrayWithNoDuplicates = []
var x = 0;
for (var i = 0; i < newString.length; i++){
// if the char appears in another index
// or if it's already in the result - don't add it
if (newString.lastIndexOf(newString[i]) !== i || finalArrayWithNoDuplicates.indexOf(newString[i]) > -1){
continue;
}
else{
finalArrayWithNoDuplicates[x++] = newString[i];
}
}
return finalArrayWithNoDuplicates.join("");
};
var arr = [1,2,3,4,5,4,5,6,7];
alert(duplicate(arr));
<强>输出:强>
1234567