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