Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/400.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用javascript中的嵌套for循环返回字符串中重复次数最多的字母_Javascript_Nested Loops - Fatal编程技术网

使用javascript中的嵌套for循环返回字符串中重复次数最多的字母

使用javascript中的嵌套for循环返回字符串中重复次数最多的字母,javascript,nested-loops,Javascript,Nested Loops,有两个类似的问题,但是,我不想搜索特定的字符或字母,也不想找到第一个字母重复的单词。另外,我想用纯javascript实现这一点 我试图构建一个函数,该函数以字符串作为输入,循环字符串中的每个单词,并返回重复字母最多的单词。如果有多个单词具有相同数量的重复字母(无论是1个还是更多),我希望返回多个单词 这是我到目前为止得到的,但它返回字符串中的所有单词,而不是只返回重复字母最多的单词。我无法确定如何仅返回重复次数最高的单词: function repeatedLetterCounter(str)

有两个类似的问题,但是,我不想搜索特定的字符或字母,也不想找到第一个字母重复的单词。另外,我想用纯javascript实现这一点

我试图构建一个函数,该函数以字符串作为输入,循环字符串中的每个单词,并返回重复字母最多的单词。如果有多个单词具有相同数量的重复字母(无论是1个还是更多),我希望返回多个单词

这是我到目前为止得到的,但它返回字符串中的所有单词,而不是只返回重复字母最多的单词。我无法确定如何仅返回重复次数最高的单词:

function repeatedLetterCounter(str) {
  str = str.toLowerCase();
  var wordArray = str.split(" ");

  var results = [];
  for (var i = 0; i < wordArray.length; i++) {
    var countNew = 0;
    var count = 0;
    var word = wordArray[i];
    for (var a = 0; a < word.length; a++) {
      var letter = word[a];
      for (var b = a + 1; b < word.length; b++) {
        var nextLetter = word[b];
        if (letter === nextLetter) {
          countNew += 1; 
        }
      }
    }
        if (countNew > count) {
          count = countNew;
          results.push(wordArray[i]);
        } else if (countNew === count) {
          results.push(wordArray[i]);
        }
  }
  return results;
}
console.log(repeatedLetterCounter("No, Bob ran across the Mississippi."));
函数repeatedLetterCounter(str){
str=str.toLowerCase();
var wordArray=str.split(“”);
var结果=[];
for(var i=0;icount){
count=countNew;
结果:push(wordArray[i]);
}else if(countNew==计数){
结果:push(wordArray[i]);
}
}
返回结果;
}
log(repeatedLetterCounter(“不,鲍勃跑过密西西比河”);
这是我的名片

检查一下,我已经将代码模块化了一点:)

函数getMaxFrequency(字符串) { var freq={}; var maxFrequency=0; 对于(变量i=0;i最大频率) { maxFrequency=频率[字符]; } } 返回最大频率; }; 函数repeatedLetterCounter(str) { var输出=[]; var arr=str.split(“”); var freq=[]; var maxFrequency=0; 控制台日志(arr); arr.forEach(函数(值、索引){ var频率=getMaxFrequency(值); freq.push([索引,getMaxFrequency(值)]); 如果(频率>最大频率) { 最大频率=频率; } } ); 控制台日志(freq); console.log(maxFrequency); freq.forEach(函数(值){ console.log(值); if(值[1]==maxFrequency) { 输出推送(arr[值[0]]) } } ); 控制台日志(输出); 返回输出; } log(repeatedLetterCounter(“不,鲍勃跑过密西西比河”);
使用一些高阶方法:

函数repeatedLetterCounter(str){
str=str.toLowerCase();
var wordArray=str.split(“”);
var mapped=wordArray.reduce(函数(ac,x){
var res=x.分割(“”).减少(功能(acc,a){
如果(!acc[a])
acc[a]=0;
acc[a]++;
返回acc;
}, {})
交流推力(res);
返回ac;
}, [])
//mapped将每个单词映射为一个对象,其中char作为键,count作为值
wordChar=mapped.map(函数(x,索引){
var字母=[];
var计数=0;
对于(x中的变量i){
如果(计数>x[i])
继续;
如果(计数===x[i])
信。推(一);
如果(计数{
返回b.count-a.count
});
返回结果[0];
//这将返回一个包含您需要的所有信息的对象
}

log(repeatedLetterCounter(“不,鲍勃跑过密西西比河”)我不会从头开始生成新代码,但会获取您的代码并显示问题所在:

1.为什么代码返回所有单词 看看这段代码,我在其中隐藏了一些部分:

  for (var i = 0; i < wordArray.length; i++) {
    var count = 0;
    // two nested loops open and close here //
    // ...
    if (countNew > count) {
      count = countNew;
      results.push(wordArray[i]);
      // ...
    }
  }

首先,我们可以将此代码分解为一组小而有用的函数。此外,对于此任务,您不需要嵌套循环,请参见下面的代码:

function getCountedLetters (letters) {
    var h = {};

    for (var i = 0, len = letters.length; i < len; ++i) {
        var letter = letters[i];
        h[letter] = h[letter] || 0;
        ++h[letter];
    }

    return h;
}

function getMaxCount (h) {
    var count = 0;

    for (var i in h) {
        if (h[i] > count) {
            count = h[i];
        }
    }

    return count;
}

function getMaxLetterCount (letters) {
    var h = getCountedLetters(letters);

    return getMaxCount(h); 
}

function repeatedLetterCounter (str) {
    var words = str.split(' ');
    var maxCount = 0;
    var result = [];
    var len = words.length;

    for (var i = 0; i < len; ++i) {
        var word = words[i];
        var currentCount = getMaxLetterCount(word);
        if (currentCount > maxCount) {
            maxCount = currentCount;
        }
    }

    for (var i = 0; i < len; ++i) {
        var word = words[i];
        var currentCount = getMaxLetterCount(word);
        if (currentCount >= maxCount) {
            result.push(word);
        }
    }

    if (result.length == 1) {
        return result[0];
    }

    return result;
}
函数getCountedLetters(字母){ var h={}; for(变量i=0,len=letters.length;i计数){ 计数=h[i]; } } 返回计数; } 函数getMaxLetterCount(字母){ var h=getCountedLetters(字母); 返回getMaxCount(h); } 函数repeatedLetterCounter(str){ 变量词=str.split(“”); var maxCount=0; var结果=[]; var len=单词长度; 对于(变量i=0;imaxCount){ maxCount=当前计数; } } 对于(变量i=0;i=maxCount){ 结果:推送(word); } } 如果(result.length==1){ 返回结果[0]; } 返回结果; }
我知道这个问题已经有了公认的答案,但我发现这是一个有趣的挑战。下面是我根据要求编写的脚本

function repeatedLetterCounter(str) {
  var wrd = str.split(' ');
  var ltr = 'abcdefghijklmnopqrstuvwxyz'.split('');
  var words = [], holder = [], actual = [];
  var highest = 0;
  for (var i = 0; i < wrd.length; i++) {
    holder[i] = 0;
    words[i] = wrd[i];
    for (var c = 0; c < ltr.length; c++) {
      var count = (wrd[i].match(new RegExp(ltr[c],'ig')) || []).length;
      if (count > 1) {holder[i] += count;}
    }
    if (holder[i] > highest) {highest = holder[i];}  
  }
  for (var i = 0; i < holder.length; i++) {
    if (holder[i] >= highest) {actual.push(words[i]);}
  }
  return actual;
}
var str = 'No, Bob ran across the Mississippi.';
var words = repeatedLetterCounter(str);
console.log(words);
函数repeatedLetterCounter(str){
var wrd=str.split(“”);
var ltr='abcdefghijklmnopqrstuvwxyz'。拆分(“”);
变量字=[]、持有人=[]、实际=[];
var最高=0;
对于(变量i=0;i1){holder[i]+=count;}
}
如果(holder[i]>highest){highest=holder[i];}
}
对于(变量i=0;i=最高
function repeatedLetterCounter(str) {
  var wrd = str.split(' ');
  var ltr = 'abcdefghijklmnopqrstuvwxyz'.split('');
  var words = [], holder = [], actual = [];
  var highest = 0;
  for (var i = 0; i < wrd.length; i++) {
    holder[i] = 0;
    words[i] = wrd[i];
    for (var c = 0; c < ltr.length; c++) {
      var count = (wrd[i].match(new RegExp(ltr[c],'ig')) || []).length;
      if (count > 1) {holder[i] += count;}
    }
    if (holder[i] > highest) {highest = holder[i];}  
  }
  for (var i = 0; i < holder.length; i++) {
    if (holder[i] >= highest) {actual.push(words[i]);}
  }
  return actual;
}
var str = 'No, Bob ran across the Mississippi.';
var words = repeatedLetterCounter(str);
console.log(words);