面试过程中,同事提出了如题的编程题,练完手之后记录如下,具体运行情况请看 这里
window.onload = function(){
(function(){
let btn = document.getElementById('btn')
btn.addEventListener('click', function(){
let value = document.getElementById('text').value
if(value){
let result = getChatMethod2(value)
document.getElementById('str').innerText = `name: ${result.name}`
document.getElementById('num').innerText = `num: ${result.num}`
}else{
alert('请输入数据')
}
}, false)
})()
/*
* 方法1
* 1. 把字符变成数组
* 2. 然后对数组进行遍历,把对应的字符和次数保存起来obj
* 3. 对obj遍历获取最大值
* 4. 处理重复key的情况
*/
function getChatMethod1(str){
let obj = {}
str.split('').forEach((cur, index, origin) => {
if(obj[cur]){
obj[cur] = obj[cur] + 1
}else{
obj[cur] = 1
}
})
let maxNum = 0
let maxKey = ''
for(let key in obj){
if(obj[key] == maxNum){
if(Array.isArray(maxKey)){
maxKey = maxKey.concat(key)
}else{
maxKey = [].concat(maxKey, key)
}
maxNum = obj[key]
continue;
}
if(obj[key] > maxNum){
maxKey = key
maxNum = obj[key]
}
}
return {name: maxKey, num: maxNum}
}
/*
* 方法2
* 1. 把字符变成数组
* 2. 然后对数组进行sort排序
* 3. 对排序后的数组进行相邻比较,看下出现最多的是哪个
* 4. 算法优化(TODO)
*/
function getChatMethod2(str){
let newArr = str.split('').sort()
let curKey = newArr[0]
let curNum = 1
let maxKey = ''
let maxNum = 0
for(let i = 1; i < newArr.length; i++){
if(newArr[i] == curKey){
curNum++
}
if(newArr[i] != curKey || i == newArr.length - 1){
if(curNum > maxNum){
maxNum = curNum
maxKey = curKey + ","
} else if (curNum == maxNum) {
maxKey += curKey+','
}
curNum = 1
curKey = newArr[i]
}
}
return {name: maxKey, num: maxNum}
}
}
最近一段时间和公司另一位同事参与了项目组的前端人员面试,这个过程其实感触很多且感觉给自己成长了不少。
面试的流程基本即使提问问题并交流技术的过程,我们是两个同事一起面试的,问的问题并没有什么思路,而是想到什么就问什么,其实我是有准备好题目而已有计划提问的,可是由于临时决定两个人一起面试,然后没有什么默契就问得很凌乱,我觉得这个不是很友好,对被面试着来说,可能考察了下他的灵活性,可是由于css,js问题之类的都是分散开来的,那就不能系统地评估他的综合能力;而且这样的提问方式,不能体现出面试官的专业性(虽然也不是很6)。
对于被面试者来说,从他们的 回答 中,仿佛看到了自己面试时的回答。我觉得比较好的回答模版应该是这样的:
- 首先要把思路表达清楚;
- 接着才是代码的具体实现,需要把关键的属性和方法描述出来(最好能有实际项目的示例);
- 再者可以加上实现方案中的一些内部原理;
- 后续可以拓展的就还有好多啦,比如内部的一些性能、安全、优化等等
- ...
面试的时候我提了一个问题:请谈谈AJAX
原理的理解。结果被面试者把jquery
的 ajax
中的常用属性和方法怎么用的描述了一下...emmmm,当时就有点小尴尬了,我觉得这就有点答非所问了。还有一个比较尴尬的是,这个时候我不知道怎么回应他...我试过再问说内部原理了解吗,一般会回答不了解...此时此刻就感觉有点尴尬了,最糟的是,我有点觉得是因为我导致这样的尴尬。。。
提问方式,emmmm,之前面试的时候有让我比较舒服的面试官表现都会比较谦逊,曾经有一位面试官还会先自我介绍,然后再问问哪部分比较熟悉,他再提问...我就觉得这样的面试官就很专业且细心,我也想要成为这样令自己佩服的人...
一般现在如果是我提问的话,我会分几部分:
- 项目经验,会再简历上挑选项目经验深入提问: 设计思路、问题处理、职责分工、工程构建、性能优化、兼容处理,网络请求,and so on ;
- 工具的使用:git/开发工具/debugger工具等等
- 原理提问:Javascript原生的常见内容,原型、闭包、作用域、es6+、webpack 等等;CSS布局、动画、兼容 and so on;
- 如果还ok的话,会问下设计模式、浏览器、网络请求 and so on;
- ...
暂时就这个流程,一般不知道大家觉得哪个比较重要?我觉得这个流程ok的原因是,如果一来就问原生的,估计会让被面试者失去耐心和信心,虽然这是必须的,可是由于公司这边的招聘,并不是为了人员储备,所以,能开发业务其实就OK,所以...(大家懂的 ...)
...未完再续