前言
自我感觉这道题还不错,下面分享笔者觉得还不错的几种方法,欢迎各位看官也可以在评论区分享你们的高见
题目
已尽一个字符串,求出该字符串中出现次数最多的字母,以及出现的次数
解决方案
方案一
主要思路:遍历字符串,把每个字符添加到一个空对象中,作为属性名,初始属性值为1,利用对象属性名不重复的特性,进行判断,如果添加的字符在对象中已尽存在,则让属性值累加一;最后利用for…in循环遍历对象,得到属性值最大的键值对,对应的属性名就是出现次数最对的字符,属性值就是出现的次数。这种思路遍历字符串可以for…of、结合正则用replace、也可以把字符串转换为数组在进行遍历…
let str = 'adqfqncqkujfhahdabdbgf';
let mostTimes = function mostTimes() {
let reg = /[a-z]/g,
max = 1,
res;
let obj = {};
str.replace(reg, val => {
obj[val] === undefined ? obj[val] = 1 : obj[val]++;
});
for (let key in obj) {
if (obj[key] > max) {
max = obj[key];
res = key;
} else if (max === obj[key]) {
res += `|${key}`;
}
};
return `出现次数最多的字符是:${res},出现的次数是:${max}`
}
console.log(mostTimes()); //=>出现次数最多的字符是:a|d|q|f,出现的次数是:3
方案二
主要思路:对字符串进行排序,把相同的字符放在一起进行循环,如果下一个字符和当前字符相等,则给最开始计数的变量累加一,然后让该值和max的值进行比较,不想等让该值等于最初的值一,循环完以后即可得到想要的结果。这种方法还有个比较大的弊端,如果出现两个或者多个字符出现的次数一样多
let str = 'adqfqncqkujfhahdabdbgf';
let mostTimes = function mostTimes() {
let max = 1,
val = 1,
res;
let url = str.split('').sort((a,b)=>a.localeCompare(b)).join(''); //=>把字符串先转换为数组,然后进行排序
console.log(url);
for (let i = 0; i < url.length - 1; i++) { // 因为每次比较都是和下一个字符进行比较,所以不需要拿到最后一个字符
if (url[i] === url[i + 1]) {
val++;
if (val > max) {
max = val;
res = url[i];
} else if(val === max) {
res+=`|${url[i]}`;
} else {
val = 1;
}
};
return `出现次数最多的字符是:${res},出现的次数是:${max}`
}
console.log(mostTimes()); //=>出现次数最多的字符是:a|d|f|q,出现的次数是:3
方案三
主要思路:先把字符串进行排序(和方案二一样),得到字符串总长度length,,把length赋值给循环体中的 i 进行循环,每次循环循环体中的 i 减一,同时new一个正则,该正则利用分组引用的对字符串进行匹配,如果匹配成功对应的字符就是出现次数最多的字符,当前循环体中的 i 就是出现的次数
let str = 'adqfqncqkujfhahdabdbgf';
//方案三
// 写一个正则/[a-z]{i-1}/g;
let mostTimes = function mostTimes() {
let max = 1,
res;
str = str.split('').sort((a, b) => a.localeCompare(b)).join('');
for (let i = str.length; i > 0; i--) {
let reg = new RegExp(`([a-z])\\1{${i-1}}`, 'g');
if (reg.test(str)) {
max = i;
res = RegExp.$1;
break;
}
};
return `出现次数最多的字符是:${res},出现的次数是:${max}`;
}
console.log(mostTimes()); //=>出现次数最多的字符是:a,出现的次数是:3
参考
- 珠峰培训公开课;