【问题标题】:how to find the number of repeated strings如何找到重复字符串的数量
【发布时间】:2022-01-24 00:09:15
【问题描述】:

const repeat= (nums) =>{ //* Done
    let ans = []
    for(let i = 0; i< nums.length; i++){
      if(nums[i] === nums[i+1]){
         if(ans[ans.length -1] !== nums[i]){
            ans.push(nums[i])
         }
      } 
    }
    return ans.length 
}

console.log(repeat(['nsmg33de1','nsmg33de1','2211,','2211','1234','1234']))

在这个例子中,这个函数似乎不能正常工作 数组中有 3 个重复的字符串,但它会输出 2

【问题讨论】:

  • console.log() 是你的朋友。添加日志以查看发生了什么。或者添加一个断点并遍历代码。 console.log(nums[i], nums[i+1], nums[i] === nums[i+1]); if(nums[i] === nums[i+1]){ console.log 行会告诉你为什么它不工作。在开发中学习的最佳技能是调试。
  • 这并不是检查重复项的正确算法。您只是在数组中检查前面的项目。所以如果数组中的字符串都乱七八糟,它就行不通了。另外,我猜nums[i+1] 会在数组末尾抛出一个错误,因为你会超出索引。
  • 2 是正确的输出,您只是不小心在第一个 2211 后面添加了一个逗号。但是就像@dj11223344 所说的那样,如果要对其进行加扰,它不会真正输出任何有用的东西。
  • 有没有更好更简单的查找重复字符串的函数?
  • 如果在数组中的任何地方重复,这里有很多答案stackoverflow.com/questions/840781/…

标签: javascript html css arrays repeat


【解决方案1】:

[希望对你有帮助, 首先将给定的字符串转换为数组。为此,请使用string.split("")。 其次,创建一个将单词存储为键并计数为值的映射。

现在遍历 stringArray 并将当前单词存储到地图中。并在每次找到该单词时增加该单词的计数。

查看以下链接 ][1]

let words = "I am not gonna live forever, but I wanna live while I am alive";

function countRepeatedWords(sentence) {
  let words = sentence.split(" ");
  let wordMap = {};

  for (let i = 0; i < words.length; i++) {
    let currentWordCount = wordMap[words[i]];
    let count = currentWordCount ? currentWordCount : 0;
    wordMap[words[i]] = count + 1;
  }
  return wordMap;
}

console.log(countRepeatedWords(words));

【讨论】:

    【解决方案2】:

    取决于你想要什么价值?如果你想知道已经发生的重复数量,你可以将你的列表转换成一个集合来删除所有重复,然后计算这个集合和原始列表之间的大小差异,如下所示:

    function repeat(values) {
      return values.length - new Set(values).size;
    }
    

    否则,如果您想知道有多少项目至少有 1 个重复项,那就另当别论了。

    为此,您可以潜在地将集合转换为数组,然后在数组中多次找到该值的每个值处映射 1,为所有其他值映射 0。之后,您可以通过将所有这些值相加来减少此数组。像这样:

    function repeat(values) {
      return [...new Set(values)].map(v => values.filter(o => o == v).length > 1 ? 1 : 0).reduce((a, b) => a + b);
    }
    

    【讨论】:

      【解决方案3】:

      我把它放在控制台里。不是世界上最好的算法,但我认为这就是你想要做的:

      const getCountOfDuplicates = (items) => {
         const count = {};
         
         items.forEach(item => {   
           if(count[item] && count[item] > 0) {
              count[item]++;
           } else {
              count[item] = 1;
           }
         });
      
          return Object.values(count).reduce((acc, value) => {
              if(value > 1) {
              acc++;
            }
            
            return acc;
          }, 0);
      };
      
      console.log('results 1', getCountOfDuplicates(['1','2','3','4','1','2','3','5', '6', '6', '7'])); // Output: "results 1", 4
      console.log('results 2', getCountOfDuplicates(['nsmg33de1','nsmg33de1','2211,','2211','1234','1234'])) // Output: "results 2", 2
      
      

      【讨论】:

        【解决方案4】:

        您的代码很好。这个数组有问题 ['nsmg33de1','nsmg33de1','2211,','2211','1234','1234'] 采用 ['nsmg33de1','nsmg33de1','2211','2211','1234','1234']

        也试试这个原始代码

        const arr = ['nsmg33de1','nsmg33de1','2211','2211','1234','1234']
        
        let obj = {};
        
        arr.forEach(x => {
          obj[x] = (obj[x] || 0) + 1;
        });
        
        console.log(obj);
        
        let valArray =Object.values(obj);
        
        let conunt = 0;
        
        valArray.forEach( c => {
            if(c > 1){
                conunt = conunt + 1;
            }
        });
        
        console.log(conunt);
        

        【讨论】:

          【解决方案5】:

          您的代码运行良好。

          从列表中的第 3 项末尾删除逗号 ,

          ['nsmg33de1','nsmg33de1','2211,','2211','1234','1234']
          

          结果:

          ['nsmg33de1','nsmg33de1','2211','2211','1234','1234']
          

          const repeat = nums => { //* Done
              let ans = []
              for (let i = 0; i < nums.length; i++) {
                if (nums[i] === nums[i+1]) {
                   if (ans[ans.length-1] !== nums[i]) {
                      ans.push(nums[i])
                   }
                } 
              }
              return ans.length 
          }
          
          console.log(repeat(['nsmg33de1','nsmg33de1','2211','2211','1234','1234'])) // -> 3

          如果单词不按顺序使用以下内容:

          const getRepeatedWordsCount = list => {
            let wordDict = {};
            let total = 0;
            
            for (let word of list) {
              total += wordDict[word] ? 1 : 0;
              wordDict[word] = 1;
            }
            
            return total;
          }
          
          console.log(getRepeatedWordsCount(['nsmg33de1','2211','1234','nsmg33de1','1234', '2211'])) // -> 3

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2017-08-26
            • 2019-08-09
            • 1970-01-01
            • 2017-02-22
            • 2012-08-30
            • 2017-06-25
            • 2014-08-25
            相关资源
            最近更新 更多