删除阵列中的重复项而不使用正则表达式或过滤器

时间:2013-11-08 22:02:05

标签: javascript

我已经被困在这个问题上几个小时了,但没有取得任何进展。我觉得这应该很简单。我试图删除字符串中的重复字符,而不使用像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循环来做到这一点?

3 个答案:

答案 0 :(得分: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²)性能,与其他可能的方法相比,这种性能非常差。它的主要卖点是它很简单,一切都“发生在你眼前”。

答案 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)

  1. 不需要两个嵌套的for循环
  2. 不需要“while”循环
  3. 在以下代码行中有两个错误:for (var=0; j < newString.length; i++){第一个是var=0(编译错误),第二个是你增加i而不是j < / LI>
  4. 可以通过仅向finalArrayWithNoDuplicates添加唯一元素(不会出现两次)来完成
  5. 如下:

    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