这题我在纠结到底命名成"求字符出现最大次数"还是"统计字符出现最大次数"好,后来我选择后者,求表示的是你只要找到最大的次数就好,你管它是谁有几个,而统计它所表示的含义是,你要把它具体给我列举出来。之所以有这个想法,是考虑到生活中的场景哪有那么巧啊,有可能有很多个相同的最大次数呢?
好了,我们开始做题吧。
题目描述
给定一串连续的字符串(无空格不间断),要求统计出该字符串中字符出现的最大次数,返回的格式是对象格式,具体的请看测试用例。
测试用例1
输入
happyeveryday
输出
{ y: 3 }
测试用例2
输入
ataolaismeiamfinedonotworry
输出
{ a: 4, o: 4 }
题解
先天真一下下
怎么个天真法呢,假定一串字符串,有且仅有一个最大的字符出现次数,具体多少次,有辣么多辣么多辣么多次,你尽管想。返回格式形如{ key: a, value: 5}
这个,key表示出现的字符,value表示最大的次数。
好,首先我们可以定义一个对象obj={}
,之后我们一层遍历,如果这个对象的key有遍历字符我们就加1,如果没有我们设置它为1.到这一步,我们可以列举出所以字符出现的次数。接下来,我们就定义我们最开始的输出格式形如res = { key: '', value: 0 }
,我们把得到的obj的key遍历一次,跟我们预先设置的res的value做比较,如果比它大就进行相应赋值。到这一步,答案就很显而易见了。
function getMaxCountLetter(str) {
const obj = {};
for (let i = 0; i < str.length; i++) {
if (obj[str[i]]) {
obj[str[i]]++;
} else {
obj[str[i]] = 1;
}
}
const res = {
key: '',
value: 0,
}
for (const key in obj) {
if (obj[key] > res.value) {
res.key = key;
res.value = obj[key];
}
}
return res;
}
再现实一点点
如果写出楼上的写法,面试的时候其实已经是放行了。但是生活往往是很多的不理想构成的理想社会。正所谓,too young too simple, sometimes navie. 那我们就进一步优化,我们把可能存在多个相同最大值的情况考虑进去。
好,我们接着讲。上面的思路直到获取obj对象都不用改动,我们接着只是想知道,最大的那位选手它的值是多少,它是谁我不care的。那么我们就要求其中的最大值,把obj对象的的值转成数组,然后ES6的扩展运算符转成string类型,再然后调用Math.max
函数,到了这一步我们知道了最大次数。紧接着最普遍的做法就是遍历一遍obj的key,然后和这个max相等的,我们塞到返回结果中,具体实现如下:
function getMaxCountLetter(str) {
const obj = {};
for (let i = 0; i < str.length; i++) {
if (obj[str[i]]) {
obj[str[i]]++;
} else {
obj[str[i]] = 1;
}
}
const max = Math.max(...Object.values(obj));
const res = {};
for (const key in obj) {
if (obj[key] === max) {
res[key] = max;
}
}
return res;
}
原题出处: 浙大网新外包岗笔试题(改动版)
代码地址: http://zhengjiangtao.cn/coding/interview/count_letters.js
项目地址: https://github.com/ataola/coding
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。