这估计是很多小公司会考的一道题吧。下面提供两种解决方法。
- 循环(任何一种循环方式)
- 正则
通常,最快想到的就是遍历进行判断:
let str = '111234441asdsadawerzxxss'
let char = ''
let count = 0
const num = str.split('').reduce((acc, cur) => {
if (acc[cur]) acc[cur]++
else acc[cur] = 1
return acc
}, {})
for (let [key, value] of Object.entries(num)) {
if (value > count) {
count = value
char = key
}
}
console.log(`字符最多的是 ${char},出现了 ${count} 次`)
然而,通过正则可以用更少的代码实现:
// 先排序
str = str.split('').sort().join('') // "aaabbbbbcccccccc"
let re = /(\w)\1+/g
str.replace(re, ($0, $1) => {
if (count < $0.length) {
count = $0.length
char = $1
}
})
console.log(`字符最多的是 ${char},出现了 ${count} 次`)
这里主要理解正则的意思:
(\w)
—\w
表示匹配字母(大小写)、数字、下划线,放在小括号()
中表示一个 group,后面可以用\n(n=1-9)
引用\1
表示第一个 group,即(\w)
,\1+
表示前面的 group 重复 1 到多次