晚上好,我继续解释我的情况。我开始对开始涉足的javascript感兴趣 用这种语言,我一直在做一些在线课程,遇到了以下任务,基本上我正在尝试通过条件“ for”告诉我字符串的第一个重复字母是什么,同时添加了功能“ .UpperCase()”在开始时效果最好,直到在这种情况下我在字符串中输入了更多字符为止“ x”使我成为输出结果“ undefined”而不是“最重复的单词是:X”达到了字符串应考虑所有字母,无论它们是小写字母还是大写字母,我都需要帮助以了解是否还有另一种方法?为此任务而前进(对不起我的英语不好)
好吧,我使用Atom Editor在JavasScript中完成此任务
var word = "SQSQSQSSaaaassssxxxY";
var contendor = [];
var calc = [];
var mycalc = 0;
function repeat() {
for (var i = 0; i < word.length; i++) {
if (contendor.includes(word[i])) {} else {
contendor.push(word[i])
calc.push(0)
}
}
for (var p = 0; p < word.length; p++) {
for (var l = 0; l < contendor.length; l++) {
if (word[p].toUpperCase() == word[l]) {
calc[l] = calc[l] + 1
}
}
}
for (var f = 0; f < calc.length; f++) {
if (calc[f] > mycalc) {
mycalc = calc[f]
}
}
}
repeat()
console.log("The first letter repeated its: " + contendor[mycalc])
我希望字符串的输出为:“ X”
但实际输出为:“未定义”
答案 0 :(得分:0)
如果要获得重复次数最多的字母index
,可以使用Array.from
将单词转换为数组。添加地图功能以使所有字母都大写。
使用reduce
和Object.entries
使用indexOf
获取数组中字母的索引。请注意,indexOf
从0开始计算字母。
var word = "MBXAYMZAXmZYxxxxxxxxxxmBxAYMZaXmZY";
var letters = Array.from(word, o => o.toUpperCase());
var [highestLetter, highestCount]= Object.entries(letters.reduce((c, v) => (c[v] = (c[v] || 0) + 1, c), {})).reduce((c, v) => c[1] > v[1] ? c : v);
var index = letters.indexOf(highestLetter);
console.log("Most repeated letter:", highestLetter);
console.log("Count:", highestCount);
console.log("First Index:", index);
答案 1 :(得分:0)
您可以通过以下方式找到字符串中出现次数最多的字母:
使用JavaScript表示这种情况的一种方法是通过以下方式:
function findMaxLetter(word) {
/* Create a map that relates letters to the number of times that letter occours */
const letterCounts = Array.from(word).reduce((map, letter) => {
return { ...map, [letter] : (map[letter] === undefined ? 0 : map[letter] + 1) }
}, {})
/* Sort letters by the number of times they occour, as determined in letterCounts map */
const letters = Object.entries(letterCounts).sort(([letter0, count0], [letter1, count1]) => {
return count1 - count0
})
.map(([letter]) => letter)
/* Return letter that occoured the most number of times */
return letters[0]
}
console.log("The first letter repeated its: " + findMaxLetter("MBXAYMZAXmZYxxxxxxxxxxmBxAYMZaXmZY"))
答案 2 :(得分:0)
console.log("The first letter repeated its: " + contendor[mycalc])
您试图打印contendor
的第14个索引,该索引只有9个值,这就是为什么您的日志结果未定义的原因。
您可能想打印word[mycalc]
。
此外,如果您打算将x
算作X
,则应该将toUpperCase()添加到处理/遍历的每个字母中。
这仅是代码中问题的注释,有更好/更快/更干净的解决方案可以达到结果,我相信其他答案也会提供。
答案 3 :(得分:0)
这是最适合您的解决方案
function func( word ){
word = word.toLowerCase();
var i, charCountCache = {};
//store all char counts into an object
for( i = 0; i < word.length; i++){
if( charCountCache[ word[ i ] ] )
charCountCache[ word[ i ] ] = charCountCache[ word[ i ] ] + 1;
else
charCountCache[ word[ i ] ] = 1;
}
//find the max value of char count in cached object
var fieldNames = Object.keys( charCountCache )
, fieldValues = Object.values( charCountCache )
, mostReapeatChar = '', mostReapeatCharCount = 0;
for( i = 0; i < fieldNames.length; i++ ){
if( mostReapeatCharCount < fieldValues[i] ){
mostReapeatCharCount = fieldValues[i];
mostReapeatChar = fieldNames[i];
}
}
console.log('most repeating char: ', mostReapeatChar, ' no of times: ', mostReapeatCharCount )
}
答案 4 :(得分:0)
我的建议是创建一个哈希图,例如
letter => [indexLetter1, indexLetter2].
从该哈希图中,您可以轻松找到第一个重复的字母。
对于该字符串MBXAYMZAXmZYxxxxxxxxxxmBxAYMZaXmZY
,哈希图看起来像
[
M => [0,5,..],
B => [1, ..],
X => [2, ..],
...
]
现在您可以在其数组中找到每个字母具有多个值的字母,然后在这些数组中取值最小的一个字母。
答案 5 :(得分:0)
脚本中的第一个错误是您在mycalc
中存储了错误的值:
mycalc = calc[f]
由于您希望mycalc
成为索引,因此上述内容应该是
mycalc = f
现在,您将得到结果,但是您的代码实际上正在花很多精力来查找大写字符,该字符在最常见的而不是第一。
您的比较应该在比较的两边都使用toUpperCase
,否则小写字母将永远不会匹配。
要获得最经常重复出现的字符,可以使用Map
(以像calc
一样计数):
function mostRepeated(str) {
const map = new Map;
let result;
let maxCount = 0;
for (let ch of str) {
ch = ch.toUpperCase();
let count = (map.get(ch) || 0) + 1;
map.set(ch, count);
if (count > maxCount) {
maxCount = count;
result = ch;
}
}
return result;
}
var word = "MBXAYMZAXmZYxxxxxxxxxxmBxAYMZaXmZY";
console.log(mostRepeated(word));
请注意,您最好使用函数参数和局部变量。将变量声明为全局变量不视为最佳做法。