【问题标题】:Function gets the number of occurrences of each letter in specified string函数获取指定字符串中每个字母出现的次数
【发布时间】:2018-01-02 18:20:59
【问题描述】:

以下函数获取指定字符串中每个字母的出现次数。我明白在第二个 for 循环之前发生了什么。他为什么要加"var j = i + 1;"?而不是以"var j=0"开头?

function okkur(txt) {
  var str = txt.toLowerCase().replace(/\s+/g, "").split("");
  var okk = "";
  var count = 0
    for (var i = 0; i < str.length; i++) {
      count = 1;
      for (var j = i + 1; j <= str.length; j++) {
        if (str[i] === str[j]) {
        count++;
        str.splice(j, 1);
        }
      }
      okk = okk.concat(str[i] + " occurs " + count + " times. \n");
    }
return okk;
}

或者有没有更简单的方法可以实现这个功能?

【问题讨论】:

  • 似乎有点过于复杂...
  • 在索引 i 处,您已找到给定字符的第一次出现,i+1 您正在检查其他出现,而将 i 放在一边。
  • 如果 j0,那么它会将相同的字符计算为重复
  • 我同意。更简单的解决方案?
  • 我建议用它创建一个对象,因此您可以将字符串转换为出现的对象,其中键是字符,值是出现次数。您可以使用reduce 轻松进行此转换。例如hello 转换为{h:1,e:1,l:2,o:1}。然后,您可以迭代该对象以进行日志记录。

标签: javascript function compare


【解决方案1】:

您可以使用哈希表来计算每个字母的数量。

这种方法使用一个循环来访问所有字母,并使用另一个循环来生成结果。

function okkur(txt) {
    var hash = Object.create(null);

    txt .toLowerCase()
        .replace(/\s+/g, "")
        .split("")
        .forEach(function (c) {
            hash[c] = (hash[c] || 0) + 1;
        });

    return Object
        .keys(hash)
        .map(function (k) {
            return k + " occurs " + hash[k] + " times.";
        })
        .join('\n');
}

console.log(okkur('stackoverflow'));
.as-console-wrapper { max-height: 100% !important; top: 0; }

【讨论】:

  • 感谢 Nina,但我是 JS 新手,还没有接触过哈希表。
  • 它只不过是 javascript 中的一个对象。它就像一个数组,但未排序并使用字符串作为访问器而不是索引。
  • 我明白了。我对以下内容感到困惑: .forEach(function (c) { hash[c] = (hash[c] || 0) + 1; });
  • 它将字符作为对象的键,如果该键不存在,则返回undefined,这是一个falsy 值,它与以下logical OR || 一起评估为零并且此处返回零。后来添加了一个。如果哈希值为truthy,类似一个不为零的数字,则取该数字并加一进行计数。
【解决方案2】:

通过在 j = i+1 而不是 j = 0 处开始第二个循环,该函数将检查索引 i 之后的所有字母。

【讨论】:

    【解决方案3】:

    我会选择这样的东西,这样你就可以在一个对象中拥有一个良好的结构。

    const charFreq = text => text.split('').reduce((oFrequency, sChar) => {
        oFrequency[sChar] ? oFrequency[sChar]++ : oFrequency[sChar] = 1;
        return oFrequency
    }, {})
    

    从这个结构中,您可以根据您的情况显示您想要的输出:

    Object.keys(charFreq).map(word => `${word} occurs ${charFreq[word]} times`).join('/n')
    

    所以你的最终功能应该是这样的:

    function okkur (text) {
       const charFreq = text.split('').reduce((oFrequency, sChar) => {
         oFrequency[sChar] ? oFrequency[sChar]++ : oFrequency[sChar] = 1
         return oFrequency
       }, {})
       return Object.keys(charFreq).map(word => `${word} occurs ${charFreq[word]} times`).join('\n') 
    }
        
    console.log(okkur('stackoverflow'))

    【讨论】:

      【解决方案4】:

      我决定改进我之前给出的答案。它基本上是相同的,只是有另一个函数可以遍历您要检查的每个数字/字母/符号。它还会检查您正在检查的字符串中出现零次的每个数字/字母/符号。

      请记住,我们正在为 countTheseCharacters() 函数提供正则表达式。因此,如果有特殊字符,您必须对其进行转义(例如点和分词)。

      这可能不是最高效的解决方案。但我认为这是你可以遵循的:)。您还可以用任何内容替换正则表达式,并检查具有相同功能的字符串中存在多少次单词(如披萨)。

      function countLetters(string, match){
        let regExp = new RegExp(match,"gi");
        let result = string.match(regExp);
        if(result){
          return result.length;
        }else{
          return 0;
        }
      }
      
      function countTheseCharacters(string, regularExpressionsToCheck){
        let countedNumbers = [];
        regularExpressionsToCheck.forEach(function(character){
          countedNumbers.push({
            'character': character,    
            'occurances': countLetters(string, character)
          });
        });
        return countedNumbers;
      }
      
      let result = countTheseCharacters("Hello. I like Pizza. Do you like pizza too? The pizzaman, said he does as well!", ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "\\bpizza\\b","\\."]);
      console.log(result);

      【讨论】:

        猜你喜欢
        • 2016-01-23
        • 1970-01-01
        • 2020-07-23
        • 2017-04-04
        • 1970-01-01
        • 2017-01-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多