0

我已经被这个问题难住了几个小时,并且没有取得任何进展。我觉得这应该很简单。我正在尝试删除字符串中的重复字符,而不使用过滤器或 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 语言。有没有办法只使用 aa for 和 while 循环来做到这一点?

4

3 回答 3

1

建议的代码有几个问题:

  • 它有严重的错误(内循环写错了)
  • 您根本不需要涉及数组,字符串就可以了
  • “if char !== other char”检查永远不会提供足够的信息来采取行动

这是使用 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²),与其他可能的方法相比非常差。它的主要卖点是简单明了,一切都发生在“眼前”。

于 2013-11-08T22:08:00.330 回答
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("");
};
于 2013-11-08T22:07:33.430 回答
0
  1. 不需要两个嵌套的 for 循环
  2. 也不需要“while”循环
  3. 在下面的代码行中有两个错误:for (var=0; j < newString.length; i++){第一个是var=0(编译错误),第二个是你递增i而不是j
  4. 可以通过仅添加唯一元素(不会出现两次)来完成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

于 2013-11-08T22:14:14.043 回答