在js的笔试中,这道题出现的概率还是比较高的.下面简单聊聊这道题
首先说,这道题的解法有很多种,为了便于理解.今天介绍一种我认为最简单最易理解的一种解法 "对象法".下面上案例,
let str = 'djaouoiutjjjjj'; // 定义字符串
var obj = {}; // 先定义一个空对象,稍后使用.
for (var i = 0; i < str.length; i++) { // 循环字符串中每一项
var k = str[i]; // 把每一项保存给变量 k (对这一步不理解可先熟悉
for循环机制);
if (obj[k]) {
obj[k] ++;
} else {
obj[k] = 1;
}
}
console.log(obj); // 输出{d: 1, j: 6, a: 1, o: 2, u: 2, …};
let num = 0;
let value = null;
for (var j in obj) {
if (obj[j] > num) {
num = obj[j];
value = j;
}
}
console.log(value, num); // 输出 "j" 6
从if判断开始说明: 如果对象中有obj[k],因为循环开始时,此时 obj[k]每一项一定是空字符串.循环完一次后,一定 有一项 obj[k]为'1';然后进行第二次循环,这时候 进入if判断.如果对象中有obj[k],也就是和第一次 循环的字符串是同一个.那么,第一次循环的 obj[k]: '1';就变为obj[k]: '2';相反,如果没 有这个字符串,那么,增加这个字符串的value值为 1; obj[k]: '1'.如此往复; 也就是说 循环开始后的对象应该是这样的:
let obj = {
"d": '',
"j": '',
"a": '',
"o": '',
"u": '',
"o": ''
...
}
然后逐渐变为:
let obj = {
"d": '1',
"j": '1',
"a": '1',
"o": '2', // 字符串'o'是第一次重复的.如果重复,这个数字就++.否则就让value值由空变为1.
"u": '1',
...
}
最后变为这样:
let obj = {
"d": 1,
"j": 6,
"a": 1,
"o": 2,
"u": 2
}
估计看到这儿都明白了,最后的for in循环就是输出出现次数最多的字符串和次数.应该不用说明了.