单词中重复出现字母频率最高的字符串

String with the highest frequency of recurring letters in a word

本文关键字:频率 字符串 单词中      更新时间:2024-03-19

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

让函数LetterCountI(str)接受正在传递的str参数,并返回重复字母数最多的第一个单词。例如:"今天,是有史以来最伟大的一天!"应该返回great,因为它有2个e(和2个t),而且它在之前也有2个。如果没有重复字母的单词,则返回-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!");

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

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

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

代码的问题在于以下代码部分的定位:

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;

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

此外,为了好玩,这里是我的替代解决方案。

开始

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!"));

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;
    }