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

4
这是一个针对coderbyte的挑战,我想尝试使用不同于循环、对象的方法来解决它。虽然它通过了测试,但并不完美。挑战的指导如下:
编写一个函数LetterCountI(str),它将传入的str参数作为输入,并返回具有最多重复字母的第一个单词。例如:"Today, is the greatest day ever!"应该返回"greatest",因为它有2个e(和2个t),并且出现在也有2个e的"ever"之前。如果没有单词中有重复字母,则返回-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' 时,它记录了 'toddday'。我的代码完全错误吗?我意识到如果参数是 ("caatt dooog"),它应该记录 'caatt',因为有4个重复的字母,但我不担心这个问题,我只关心它找到最多重复一个字母(但是如果您有解决方案,请让我知道!)。 如果需要对变量进行任何更改以使该代码更易读,则会赞赏。


2
你确定“caatt dooog”应该返回“caatt”吗?我认为要求是对于三个字母的重复,返回“dooog”,而不是“caatt”,后者只有两个字母的重复,尽管出现了两次。 - musefan
我只是在说,如果我们按照Coderbyte的指示操作,caatt会有更多的重复字母。 - user2755667
1
但这就是我的意思,你发布的指令有点误导人,我认为你解释错了。线索在于要求在最大值中给出了重复值2,而不是4,这符合你在“caatt dooog”示例中的规则。 - musefan
使用下划线,您可以在几行代码中完成此操作... 如果您想要另一种方法,我可以准备一个答案。 - elclanrs
这里有一个替代方案:(http://fiddle.jshell.net/5KVY6/1125/)。我没有将其作为答案,因为它并没有回答你最初的问题。 - UltraInstinct
3个回答

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;

你原先的代码问题在于,你只返回了第一个有重复字符的单词,这意味着你的代码没有足够进一步检查是否有更多的单词有重复字符。
顺便说一句,这里是我的替代方案,供大家参考。

很好,谢谢@musefan非常有帮助,看起来我在昏睡中忘记了这个 :) - user2755667

0

这里是

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

0

活力林Q !!!!!

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接