找出一个字符串中哪个字母出现的次数最多,最多的多少次?
找出一个字符串中哪个字母出现的次数最多,最多的多少次?
字符串循环方法
let str = "axihe2020an06bang30";
let obj = {};
[].forEach.call(str, item => {
if (typeof obj[item] !== 'undefined') {
obj[item]++;
return;
}
obj[item] = 1;
})
let target = {
MAX_VAL: 1,
item: ''
}
for (const key in obj) {
const element = obj[key];
if (element > target.MAX_VAL) {
target.MAX_VAL = element;
target.item = key;
}
}
console.log('obj', obj);
console.log('target', target);//{MAX_VAL: 4, item: "0"}
思考出现多个项都是一样的,该如何写呢?
正则验证 - 最优
let str = "axihe2020an06bang30";
// 把字母都排序到一起
let tempAry = str.split('').sort((a, b) => {
return a.localeCompare(b);
// localeCompare 比较位置前后,可以排序
})
console.log(tempAry.join(''),);
// 写正则:需求,匹配连续出现数量多的字符
//(\w)需要捕获的内容,\1 和前面出现一样的,并且出现过1次以上的时候才匹配
let reg = /(\w)\1+/g;
let matchAry = tempAry.join('').match(reg);
console.log(matchAry);//["0000", "22", "aaaa", "ee", "hh", "ii", "nn", "xx"]
matchAry.sort((a, b) => { return b.length - a.length });
console.log(matchAry);// ["0000", "aaa", "22", "nn"] 按照长度排序的
思考出现多个项都是一样的如何?
思考:如果使用 ‘axihe2020an06bang30axihe’ 0 和 a 都是相同次数呢?
// 兼容多个的
let matchAry = ["0000", "aaaa", "22", "nn"];
// 设置第一个是最大的
let target = {
MAX_VAL: matchAry[0].length,
item: [matchAry[0].slice(0, 1)]//slice 或者 substr(0,1) 等都可以
}
let targetAry = [];
matchAry.forEach(element => {
// >= 可以把相同长度的也找到
if (element.length >= target.MAX_VAL) {
targetAry.push({
item: element[0].slice(0, 1),
length: element.length
})
}
})
console.log('targetAry', targetAry);
上面运行的结果是 [ {item: "0", length: 4},{item: "a", length: 4}]
其它方法
上面是一个思路指引,如果 localeCompare 比较位置前后,可以正则动态匹配固定数量的连续出现的字符;
然后通过 whild 方式,或者递归的方式来实现;