【问题标题】:String with the highest frequency of recurring letters in a word单词中出现频率最高的字符串
【发布时间】:2013-12-20 16:47:13
【问题描述】:

这对 coderbyte 来说是一个挑战,我想我会尝试使用与循环、对象不同的方法来解决它。它通过了,但并不完美。挑战的方向是:

让函数 LetterCountI(str) 接受传递的 str 参数并返回第一个具有最多重复字母数的单词。例如:“今天,是有史以来最伟大的一天!”应该返回最大,因为它有 2 个 e(和 2 个 t),而且它比以前也有 2 个 e。如果没有重复字母的单词返回-1。单词将用空格分隔。

 function LetterCountI(str){
  var wordsAndLetters = {};   
  var count = 0;
  var finalword;
  str = str.split(" ");
  for(var i = 0; i < str.length; i++){
    wordsAndLetters[str[i]] = wordsAndLetters[str[i]] || 0;
  }
  function countWordLetters(strs){
    strs = strs.split("");
    var lettercount = {};
    for(var i = 0; i <strs.length; i++){
      lettercount[strs[i]] = lettercount[strs[i]] || 0;
      lettercount[strs[i]]++;
    }
    return lettercount;
  }
  for(var words in wordsAndLetters){
    wordsAndLetters[words] = countWordLetters(words);
    var highestLetterFrequency = wordsAndLetters[words];
    for(var values in highestLetterFrequency){
      if(highestLetterFrequency[values] > count){
        count = highestLetterFrequency[values];
        finalword = words;
      }
      if(count !== 1){
        return finalword;
      }
    }
  }
  return -1;
}
LetterCountI("today is the greatest day ever!");

抱歉,如果某些变量名称令人困惑,我已经花了很长时间试图弄清楚我做错了什么。如果您使用代码底部的参数,它会返回 'greatest' 就像它应该将参数更改为

LetterCountI("toddday is the greatttttest day ever!");

当它应该记录“greatttttest”时,它会记录“toddday”。我的代码完全错误吗?我意识到如果参数是(“caatt dooog”)它应该记录“caatt”,因为有 4 个重复出现的字母,但我并不担心我只是担心它会找到一个字母的重复次数最多(但无论如何如果您有解决方案,我想听听!)。如果需要对变量进行任何更改以使此代码更具可读性,我们将不胜感激!

【问题讨论】:

  • 你确定“caatt dooog”应该返回“caatt”吗?我会说要求是为 3 个字母重复返回“dooog”,而不是“caatt”,它只有 2 个字母重复,尽管重复两次
  • 我只是说,如果我们按照这里的 coderbyte 说明进行操作,那么 caatt 会有更多重复出现的字母。
  • 但这就是我的意思,您发布的说明有点误导,我认为您对它们的解释是错误的。线索是要求给出了最大重复值 2,而不是 4,这符合“caatt dooog”示例中的规则
  • 使用下划线,你可以在几行中做到这一点......如果你想要另一种方法,我可以准备一个答案。
  • Here's an alternative solution..。我没有把它作为答案,因为这不能回答你原来的问题。

标签: javascript object for-loop


【解决方案1】:

Here you go

Array.prototype.getUnique = function(){
   var u = {}, a = [];
   for(var i = 0, l = this.length; i < l; ++i){
      if(u.hasOwnProperty(this[i])) {
         continue;
      }
      a.push(this[i]);
      u[this[i]] = 1;
   }
   return a;
}

function LetterCountI(str){
    var temp = str.split(" ");
    var final = '', weight = 0;
    for(var i = 0; i < temp.length; ++i) {
        var word = temp[i].split("");
        if(word.getUnique().length < word.length) {
            var diff = word.length - word.getUnique().length;
            if(diff > weight){
                weight = diff;
                final = temp[i];
            }
        }
    }
    return final;
}

console.log(LetterCountI("Catt dooog"));
console.log(LetterCountI("toddday is the greatttttest day ever!"));

【讨论】:

    【解决方案2】:

    你的代码的问题在于下面这段代码的定位:

    if(count !== 1){
        return finalword;
    }
    

    将其从当前位置移动到 return -1 之前,如下所示:

    for(var words in wordsAndLetters){
        wordsAndLetters[words] = countWordLetters(words);
        var highestLetterFrequency = wordsAndLetters[words];
        for(var values in highestLetterFrequency){
          if(highestLetterFrequency[values] > count){
            count = highestLetterFrequency[values];
            finalword = words;
          }
        }
    }
    if(count !== 1){
        return finalword;
    }
    return -1;
    

    您的原始代码的问题在于您返回的第一个单词有重复字符,这意味着您的代码没有足够远来检查任何后续单词是否有更多重复字符。

    另外,只是为了好玩,here is my alternative solution。

    【讨论】:

    • 很好,谢谢@musefan 非常有帮助,好像我在昏昏欲睡的状态下把它隔开:)
    【解决方案3】:

    Viva LinQ !!!!!!

        var resultPerWord = new Dictionary<string, int>();
    
        var S = "toddday is the greatttttest day ever!";
    
        foreach(var s in S.Split(' ')) 
        {
            var theArray =
                from w in s
                group w by w into g
                orderby g.Count() descending
                select new { Letter = g.Key, Occurrence = g.Count() };
    
            resultPerWord.Add(s, theArray.First().Occurrence);
        }
    
        var r = "-1";
        if (resultPerWord.Any(x => x.Value >1))
        {
            r = resultPerWord.OrderByDescending(x => x.Value).First().Key;
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-02
      • 2017-07-01
      相关资源
      最近更新 更多