【问题标题】:Printing index of duplicate numbers in array javascript在数组javascript中打印重复数字的索引
【发布时间】:2017-07-05 17:45:12
【问题描述】:

我需要在数组中找到第一个重复的数字,然后在控制台中打印这个数字的索引。在下面的代码中,我到达了代码找到重复但打印其索引的时刻。简单来说,2 在数组中是重复的,但它位于第一位,所以我需要打印索引“0”。

var sameNum = [2, 4, 5, 2, 3, 5, 1, 2, 4];
var firstIndex = [];

for (var i = 0; i < sameNum.length; i++) {
  for (var j = i; j < sameNum.length; j++) {
    if (i != j && sameNum[i] == sameNum[j]) {
      firstIndex = [i];
    }
  }
}
console.log(firstIndex);

【问题讨论】:

标签: javascript arrays for-loop indexof


【解决方案1】:

如果我对问题的理解正确(您正在寻找不止一次出现的数字的第一个索引),那么 i 的值就是您要查找的值,因为它代表索引。

if(i != j && sameNum[i] == sameNum[j]) {
  firstIndex.push(i);
  // or print it //
  console.log(i)
}

【讨论】:

  • 是的,这就是我要找的,但我需要打印索引而不是索引后面的数字
  • 我在您的答案中添加了一个示例,这有意义吗?如果您需要重复项的所有索引位置,还可以对其进行重构以收集 j 的值。
【解决方案2】:

我用过这个solution

Array.prototype.getDuplicates = function () {
    var duplicates = {};
    for (var i = 0; i < this.length; i++) {
        if(duplicates.hasOwnProperty(this[i])) {
            duplicates[this[i]].push(i);
        } else if (this.lastIndexOf(this[i]) !== i) {
            duplicates[this[i]] = [i];
        }
    }

    return duplicates;
};

console.log([1, 2 ,3 ,4 ,5 ,6 ,6 ,7 ,8 ,9].getDuplicates());

【讨论】:

    【解决方案3】:

    我将关联数组用于(快速)查找/存储遇到的值。

    var inputArray = [1, 2 ,3 ,4 ,5 ,6 ,6 ,7 ,8 ,9];
    var encounteredIndices = {};
    
    for(var i = 0; i < inputArray.length; i++)
      if (encounteredIndices[inputArray[i]])
        console.log(i); // Or add to some array if you wish
      else
        encounteredIndices[inputArray[i]] = 1;
    

    【讨论】:

      【解决方案4】:

      如果需要,您可以先对数组进行排序。这样做会按升序排列。然后使用forEach 循环遍历数组,并获取索引

      var sameNum = [1, 3, 2, 4, 5, 6, 6, 6, 7, 7, 7, 8, 9];
      var firstIndex = [];
      // sorting the array and iterating over it
      // forEach array method accepts three parameter of which index is one of the parameter
      sameNum.sort().forEach(function(item, index) {
        if (sameNum[index + 1] == sameNum[index]) {
          console.log(index + 1);
        }
      })

      【讨论】:

        【解决方案5】:

        试试这个:-

        <!doctype html>
        <html lang="en">
        <head>
            <meta charset="UTF-8">
            <meta name="viewport"
                  content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
            <meta http-equiv="X-UA-Compatible" content="ie=edge">
            <title>Document</title>
        </head>
        <body>
        
        <input id="input" type="time">
        <button onclick="live()">run</button>
        <!---->
        <p id="output">Output</p>
        <script>
               function live() {
        
        
          var sameNum = [1, 2 ,3 ,4 ,6 ,6 ,7 ,8 ,9];
          var firstIndex;
        
          for(var i = 0; i < sameNum.length; i++) {
              for(var j = i; j < sameNum.length; j++) {
                if(i != j && sameNum[i] == sameNum[j]) {
                firstIndex = i;
                }
                if (firstIndex != null){break;}
              }
          }
        
        if (firstIndex == null){
          alert("No repeating element");
        }
        else{
          alert(firstIndex);
        }
               }
        </script>
        </body>
        </html>
        

        【讨论】:

          【解决方案6】:

          在这种情况下,嵌套循环是一个糟糕的解决方案。它提供了O(n^2) 复杂性,我们可以用地图线性求解。

          我们可以使用地图来跟踪到目前为止在单个循环中出现的字母:

          var sameNum = [1, 2 ,3 ,4 ,5 ,6 ,6 ,7 ,8 ,9];
          var lettersMap = {};
          var firstIndex = -1;
          
          for (var i = 0; i < sameNum.length; i++) {
            if (lettersMap[sameNum[i]]) {
              firstIndex = i;
              break;
            }
            else {
              lettersMap[sameNum[i]] = true;
            }
          };
          
          console.log(firstIndex);

          【讨论】:

            【解决方案7】:

            你可以使用“j”来获取重复值的索引,像这样

            var sameNum = [1, 3, 2 ,3 ,4 ,5 ,6 ,6 ,7 ,8 ,9];
            var firstIndex = [];
            
            for(var i = 0; i < sameNum.length; i++) {
              for(var j = i; j < sameNum.length; j++) {
                if(i != j && sameNum[i] == sameNum[j]) {
                  console.log("--------"+sameNum[i]+"--------");
                  console.log("Index: "+ j);
                }
              }
            }

            【讨论】:

              猜你喜欢
              • 2019-10-26
              • 2012-05-13
              • 2013-06-21
              • 2019-07-03
              • 2013-06-10
              • 1970-01-01
              • 2016-02-16
              • 1970-01-01
              • 2016-12-07
              相关资源
              最近更新 更多