在一个前端交流群里,看到群友面试,有这么一道题,就试着写了一下。当存在多个出现次数相同且都为最大长度的字符时,也将其统计出来,js代码如下:
function findStr(string) {
// itemMapLength 字符和其连续出现长度的映射
// length 当前字符连续出现长度
// prevLength 上一次连续出现次数最多的字符的长度
let itemMapLength = {},
length = 1,
prevLength = 1;
const map = (i) => {
// 如果当前长度大于等于上一次
if (length >= prevLength) {
// 如果是大于,则清空itemMapLength;否则,保持itemMapLength不变
itemMapLength = length > prevLength ? {} : itemMapLength;
// 保存新的字符以及对应长度
itemMapLength[string.charAt(i)] = length;
// 记录新的字符连续出现最大长度
prevLength = length;
}
}
for (let i = 0; i < string.length; i++) {
// 比较当前字符和下一个字符是否相同,如果相同,则length加1;
if (string.charAt(i) === string.charAt(i + 1)) {
length++;
// 此处用以判断防止最后出现的一直都是相同的字符,导致无法更新itemMapLength
if (i + 1 === string.length - 1) {
map(i);
}
} else {
map(i);
// 重置下次连续出现字符长度为1
length = 1;
}
}
// 将itemMapLength转换为key数组,用于拼接最终结果以及判断连续出现的最大长度字符是否只有一个
const itemMapLengthKeysArr = Object.keys(itemMapLength);
// 拼接结果
let strResult = itemMapLengthKeysArr.reduce((reduceStr, item) => {
return `${reduceStr}${item}: 次数为${itemMapLength[item]}, `
}, '').slice(0, -2);
return `${itemMapLengthKeysArr.length > 1 ? '连续出现的最多的字符不止一个,分别为:' : '连续出现的最多的字符有一个,为:'}${strResult}`;
}
输出结果如下:
console.log(findStr('abcdef'))
console.log(findStr('aabbccddeeff'))
console.log(findStr('aabbcccddeeeff'))
console.log(findStr('aabbccdddeeddddff'))
console.log(findStr('aabbccddeeddddfffffffh'))
console.log(findStr('aabbccddeeddddffffffffff'))
console.log(findStr('aaaaaaaaaaabbccdddeeddddff'))
如果发现有什么不足之处或者不正确需要修改补充的地方,欢迎指正,共同进步~~~