面试题-统计字符出现最大次数
这题我在纠结到底命名成"求字符出现最大次数"还是"统计字符出现最大次数"好,后来我选择后者,求表示的是你只要找到最大的次数就好,你管它是谁有几个,而统计它所表示的含义是,你要把它具体给我列举出来。之所以有这个想法,是考虑到生活中的场景哪有那么巧啊,有可能有很多个相同的最大次数呢?
好了,我们开始做题吧。
题目描述
给定一串连续的字符串(无空格不间断),要求统计出该字符串中字符出现的最大次数,返回的格式是对象格式,具体的请看测试用例。
测试用例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
- 图解javascript this指向什么?
- 2017/6/8-python正则表达式的使用
- 洛谷P1306 斐波那契公约数
- Angular开发实践(二):HRM运行机制
- Angular开发实践(一):环境准备及框架搭建
- 洛谷P2818 天使的起誓
- 连续子数组的最大和
- 10.25解题报告
- React第三方组件5(状态管理之Redux的使用①简单使用)
- JavaScript设计模式与开发实践 - 观察者模式
- React第三方组件4(状态管理之Reflux的使用⑤异步操作)
- Leetcode-Easy 804. Unique Morse Code Words
- JavaScript设计模式与开发实践 - 策略模式
- 二叉树的深度
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- CMake入门实战——其他
- git报错,远程克隆和更新不下来解决方法
- CMake入门实战——生成安装包
- PyTorch 60分钟入门系列之PyTorch简介
- 解决Nginx转发http后不走https的问题 后端tomcat
- PyTorch 60分钟入门系列之自动求导
- Roslyn 打包 NuGet 包添加改动日志
- PyTorch 60分钟入门系列之神经网络
- Linux 是如何管理内存的?
- Jmeter 常用函数(17)- 详解 __substring
- Jmeter 常用函数(14)- 详解 __strLen
- Jmeter 常用函数(15)- 详解 __StringFromFile
- Jmeter 常用函数(16)- 详解 __split
- Jmeter 常用函数(18)- 详解 __isDefined
- Jmeter 常用函数(19)- 详解 __BeanShell