面試過程中,同事提出瞭如題的程式設計題,練完手之後記錄如下,具體執行情況請看 這裡
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,所以...(大家懂的 ...)
...未完再續