「这是我参与2022首次更文挑战的第19天,活动详情查看:2022首次更文挑战」
在面试中,我们有可能会被问到这样的一个问题:在一个字符串中,你能计算出哪个字符串出现的次数最多,出现了多少次?想都没想,只是计算次数而已,很简单,但是要来实现的时候却是不知如何下手。
实现思路
比如字符串str = abcaaabc,要计算出在str中的出现最多的那个字母以及出现的次数;一开始想简单直接计算出来却是无法下手;想想必须要分成两步,首先得把计算出每个字母出现的次数,然后以键值对的形式创建出一个对象,字母是键,次数是值;第二步再来循环遍历对比一下,取出值最大的一个,这样就可以知道是哪个字母了。
代码实现
第一步要实现的重点在于取出字母并计算出相应出现的次数;这里需要charAt()(注:返回指定索引位置的char值)。
let str = 'sfhdsfdsfasjfsjfsdfssjflkjsldfjsfsjlsdksdf';
let obj = {};
for(let i=0; i<str.length; i++) {
if(!obj[str.charAt(i)]) {
obj[str.charAt(i)] = 1;
}else{
obj[str.charAt(i)]++;
}
}
console.log(obj)//{"s": 13,"f": 10,"h": 1,"d": 6,"a": 1,"j": 6,"l": 3,"k": 2}
在循环中需要需要先判断obj对象中是否有循环到的这个字母,若是没有就用这个字母作为一个键次数一作为值新增一项,代表这个字母出现过一次了,若是有就在该字母作为键的后面加一,当循环结束后,就能整理出字母和对应出现次数组成键值对的对象了。这样就可以继续实现第二步了。
let max = 0;
let maxStr = '';
for(let i in obj) {
if(obj[i] > max) {
max = obj[i];
maxStr = i;
}
}
console.log(`出现最多次的是 ${maxStr},一共出现 ${max} 次`);
第二步就要开始来循环我们新增的这个对象了;声明一个变量 max 并设置最小次数零次,在循环对象时,每次都拿这个变量 max 与循环到的次数 obj[i] 做对比,若是 obj[i] 小于这个变量 max,那么就进入下一轮循环,若是 obj[i] 大于这个变量 max ,那么就将 obj[i] 的值赋给 max,当前字母 i 也要存储起来;当循环结束后,这个 i 就是出现最多次的字母,出现了 obj[i] 次。