前端面試常見問題怎么回答
前端面試常見問題怎么回答?雖說我們很多時候前端很少有機會接觸到算法。大多都交互性的操作,然而從各大公司面試來看,算法依舊是考察的一方面。下面小編給大家?guī)砬岸嗣嬖嚦R妴栴}怎么回答,供大家參考!
前端面試常見問題怎么回答
Q1 判斷一個單詞是否是回文?
回文是指把相同的詞匯或句子,在下文中調(diào)換位置或顛倒過來,產(chǎn)生首尾回環(huán)的情趣,叫做回文,也叫回環(huán)。比如 mamam redivider .
很多人拿到這樣的題目非常容易想到用for 將字符串顛倒字母順序然后匹配就行了。其實重要的考察的就是對于reverse的實現(xiàn)。其實我們可以利用現(xiàn)成的函數(shù),將字符串轉(zhuǎn)換成數(shù)組,這個思路很重要,我們可以擁有更多的自由度去進行字符串的一些操作。
function checkPalindrom(str) {
return str == str.split('').reverse().join('');
}
Q2 去掉一組整型數(shù)組重復的值
比如輸入: [1,13,24,11,11,14,1,2]
輸出: [1,13,24,11,14,2]
需要去掉重復的11 和 1 這兩個元素。
這道問題出現(xiàn)在諸多的'前端面試題中,主要考察個人對Object的使用,利用key來進行篩選。
/__
_ unique an array
__/
let unique = function(arr) {
let hashTable = {};
let data = [];
for(let i=0,l=arr.length;i
if(!hashTable[arr[i]]) {
hashTable[arr[i]] = true;
data.push(arr[i]);
}
}
return data
}
module.exports = unique;
Q3 統(tǒng)計一個字符串出現(xiàn)最多的字母
給出一段英文連續(xù)的英文字符竄,找出重復出現(xiàn)次數(shù)最多的字母
輸入 : afjghdfraaaasdenas
輸出 : a
前面出現(xiàn)過去重的算法,這里需要是統(tǒng)計重復次數(shù)。
function findMaxDuplicateChar(str) {
if(str.length == 1) {
return str;
}
let charObj = {};
for(let i=0;i
if(!charObj[str.charAt(i)]) {
charObj[str.charAt(i)] = 1;
}else{
charObj[str.charAt(i)] += 1;
}
}
let maxChar = '',
maxValue = 1;
for(var k in charObj) {
if(charObj[k] >= maxValue) {
maxChar = k;
maxValue = charObj[k];
}
}
return maxChar;
}
module.exports = findMaxDuplicateChar;
Q4 排序算法
如果抽到算法題目的話,應該大多都是比較開放的題目,不限定算法的實現(xiàn),但是一定要求掌握其中的幾種,所以冒泡排序,這種較為基礎并且便于理解記憶的算法一定需要熟記于心。冒泡排序算法就是依次比較大小,小的的大的進行位置上的交換。
function bubbleSort(arr) {
for(let i = 0,l=arr.length;i
for(let j = i+1;j
if(arr[i]>arr[j]) {
let tem = arr[i];
arr[i] = arr[j];
arr[j] = tem;
}
}
}
return arr;
}
module.exports = bubbleSort;
除了冒泡排序外,其實還有很多諸如 插入排序,快速排序,希爾排序等。每一種排序算法都有各自的特點。全部掌握也不需要,但是心底一定要熟悉幾種算法。 比如快速排序,其效率很高,而其基本原理如圖(來自wiki):
算法參考某個元素值,將小于它的值,放到左數(shù)組中,大于它的值的元素就放到右數(shù)組中,然后遞歸進行上一次左右數(shù)組的操作,返回合并的數(shù)組就是已經(jīng)排好順序的數(shù)組了。
function quickSort(arr) {
if(arr.length<=1) {
return arr;
}
let leftArr = [];
let rightArr = [];
let q = arr[0];
for(let i = 1,l=arr.length; i
if(arr[i]>q) {
rightArr.push(arr[i]);
}else{
leftArr.push(arr[i]);
}
}
return [].concat(quickSort(leftArr),[q],quickSort(rightArr));
}
module.exports = quickSort;
安利大家一個學習的地址,通過動畫演示算法的實現(xiàn)。
HTML5 Canvas Demo: Sorting Algorithms(http://math.hws.edu/eck/jsdemo/sortlab.html)
Q5 不借助臨時變量,進行兩個整數(shù)的交換
輸入 a = 2, b = 4 輸出 a = 4, b =2
這種問題非常巧妙,需要大家跳出慣有的思維,利用 a , b進行置換。
主要是利用 + – 去進行運算,類似 a = a + ( b – a) 實際上等同于最后 的 a = b;
function swap(a , b) {
b = b - a;
a = a + b;
b = a - b;
return [a,b];
}
module.exports = swap;
Q6 使用canvas 繪制一個有限度的斐波那契數(shù)列的曲線?
數(shù)列長度限定在9.
斐波那契數(shù)列,又稱黃金分割數(shù)列,指的是這樣一個數(shù)列:0、1、1、2、3、5、8、13、21、34、……在數(shù)學上,斐波納契數(shù)列主要考察遞歸的調(diào)用。我們一般都知道定義
fibo[i] = fibo[i-1]+fibo[i-2];
生成斐波那契數(shù)組的方法
function getFibonacci(n) {
var fibarr = [];
var i = 0;
while(i
if(i<=1) {
fibarr.push(i);
}else{
fibarr.push(fibarr[i-1] + fibarr[i-2])
}
i++;
}
return fibarr;
}
剩余的工作就是利用canvas arc方法進行曲線繪制了
DEMO(http://codepen.io/Jack_Pu/pen/LRaxZB)
Q7 找出下列正數(shù)組的最大差值比如:
輸入 [10,5,11,7,8,9]
輸出 6
這是通過一道題目去測試對于基本的數(shù)組的最大值的查找,很明顯我們知道,最大差值肯定是一個數(shù)組中最大值與最小值的差。
function getMaxProfit(arr) {
var minPrice = arr[0];
var maxProfit = 0;
for (var i = 0; i < arr.length; i++) {
var currentPrice = arr[i];
minPrice = Math.min(minPrice, currentPrice);
var potentialProfit = currentPrice - minPrice;
maxProfit = Math.max(maxProfit, potentialProfit);
}
return maxProfit;
}
Q8 隨機生成指定長度的字符串
實現(xiàn)一個算法,隨機生成指制定長度的字符竄。
比如給定 長度 8 輸出 4ldkfg9j
function randomString(n) {
let str = 'abcdefghijklmnopqrstuvwxyz9876543210';
let tmp = '',
i = 0,
l = str.length;
for (i = 0; i < n; i++) {
tmp += str.charAt(Math.floor(Math.random() _ l));
}
return tmp;
}
module.exports = randomString;
Q9 實現(xiàn)類似getElementsByClassName 的功能
自己實現(xiàn)一個函數(shù),查找某個DOM節(jié)點下面的包含某個class的所有DOM節(jié)點?不允許使用原生提供的 getElementsByClassName querySelectorAll 等原生提供DOM查找函數(shù)。
function queryClassName(node, name) {
var starts = '(^|[ f])',
ends = '([ f]|$)';
var array = [],
regex = new RegExp(starts + name + ends),
elements = node.getElementsByTagName("_"),
length = elements.length,
i = 0,
element;
while (i < length) {
element = elements[i];
if (regex.test(element.className)) {
array.push(element);
}
i += 1;
}
return array;
}
Q10 使用JS 實現(xiàn)二叉查找樹(Binary Search Tree)
一般叫全部寫完的概率比較少,但是重點考察你對它的理解和一些基本特點的實現(xiàn)。 二叉查找樹,也稱二叉搜索樹、有序二叉樹(英語:ordered binary tree)是指一棵空樹或者具有下列性質(zhì)的二叉樹:
任意節(jié)點的左子樹不空,則左子樹上所有結(jié)點的值均小于它的根結(jié)點的值;
任意節(jié)點的右子樹不空,則右子樹上所有結(jié)點的值均大于它的根結(jié)點的值;
任意節(jié)點的左、右子樹也分別為二叉查找樹;
沒有鍵值相等的節(jié)點。二叉查找樹相比于其他數(shù)據(jù)結(jié)構(gòu)的優(yōu)勢在于查找、插入的時間復雜度較低。為O(log n)。二叉查找樹是基礎性數(shù)據(jù)結(jié)構(gòu),用于構(gòu)建更為抽象的數(shù)據(jù)結(jié)構(gòu),如集合、multiset、關聯(lián)數(shù)組等。
在寫的時候需要足夠理解二叉搜素樹的特點,需要先設定好每個節(jié)點的數(shù)據(jù)結(jié)構(gòu)
class Node {
constructor(data, left, right) {
this.data = data;
this.left = left;
this.right = right;
}
}
樹是有節(jié)點構(gòu)成,由根節(jié)點逐漸延生到各個子節(jié)點,因此它具備基本的結(jié)構(gòu)就是具備一個根節(jié)點,具備添加,查找和刪除節(jié)點的方法.
class BinarySearchTree {
constructor() {
this.root = null;
}
(data) {
let n = new Node(data, null, null);
if (!this.root) {
return this.root = n;
}
let currentNode = this.root;
let parent = null;
while (1) {
parent = currentNode;
if (data < currentNode.data) {
currentNode = currentNode.left;
if (currentNode === null) {
parent.left = n;
break;
}
} else {
currentNode = currentNode.right;
if (currentNode === null) {
parent.right = n;
break;
}
}
}
}
remove(data) {
this.root = this.removeNode(this.root, data)
}
removeNode(node, data) {
if (node == null) {
return null;
}
if (data == node.data) {
// no children node
if (node.left == null && node.right == null) {
return null;
}
if (node.left == null) {
return node.right;
}
if (node.right == null) {
return node.left;
}
let getSmallest = function(node) {
if(node.left === null && node.right == null) {
return node;
}
if(node.left != null) {
return node.left;
}
if(node.right !== null) {
return getSmallest(node.right);
}
}
let temNode = getSmallest(node.right);
node.data = temNode.data;
node.right = this.removeNode(temNode.right,temNode.data);
return node;
} else if (data < node.data) {
node.left = this.removeNode(node.left,data);
return node;
} else {
node.right = this.removeNode(node.right,data);
return node;
}
}
find(data) {
var current = this.root;
while (current != null) {
if (data == current.data) {
break;
}
if (data < current.data) {
current = current.left;
} else {
current = current.right
}
}
return current.data;
}
}
module.exports = BinarySearchTree;
完整代碼 Github(https://github.com/JackPu/JavaScript-Algorithm-Learning)
面試官一般面試問什么問題
問題一:“你為什么選擇我們公司?”
思路:
1、面試官試圖從中了解你求職的動機、愿望以及對此項工作的態(tài)度。
2、 建議從行業(yè)、企業(yè)和崗位這三個角度來回答。
3、 參考答案——“我十分看好貴公司所在的行業(yè),我認為貴公司十分重視人才,而且這項工作很適合我,相信自己一定能做好?!?/p>
問題二:“對這項工作,你有哪些可預見的困難?”
思路:
1、不宜直接說出具體的困難,否則可能令對方懷疑應聘者不行。
2、可以嘗試迂回戰(zhàn)術(shù),說出應聘者對困難所持有的態(tài)度——“工作中出現(xiàn)一些困難是正常的,也是難免的,但是只要有堅忍不拔的毅力、良好的合作精神以及事前周密而充分的準備,任何困難都是可以克服的?!?/p>
問題三:“如果我錄用你,你將怎樣開展工作”
思路:
1、 如果應聘者對于應聘的職位缺乏足夠的了解,最好不要直接說出自己開展工作的具體辦法,
2、可以嘗試采用迂回戰(zhàn)術(shù)來回答,如“首先聽取領導的指示和要求,然后就有關情況進行了解和熟悉,接下來制定一份近期的工作計劃并報領導批準,最后根據(jù)計劃開展工作?!?/p>
問題四:“與上級意見不一是,你將怎么辦?”
思路:
1、一般可以這樣回答“我會給上級以必要的解釋和提醒,在這種情況下,我會服從上級的意見?!?2、如果面試你的是總經(jīng)理,而你所應聘的職位另有一位經(jīng)理,且這位經(jīng)理當時不在場,可以這樣回答:“對于非原則性問題,我會服從上級的意見,對于涉及公司利益的重大問題,我希望能向更高層領導反映?!?/p>
問題五:“我們?yōu)槭裁匆浻媚?”
思路:
1、應聘者最好站在招聘單位的角度來回答。
2、 招聘單位一般會錄用這樣的應聘者:基本符合條件、對這份共組感興趣、有足夠的信心。
3、如“我符合貴公司的招聘條件,憑我目前掌握的技能、高度的責任感和良好的餓適應能力及學習能力 ,完全能勝任這份工作。我十分希望能為貴公司服務,如果貴公司給我這個機會,我一定能成為貴公司的棟梁!”
問題六:“請你做一下自我介紹?”
這個問題,是必備的。但真正能回答加分的不多。你要知道一個好的自我介紹,可能會決定面試成功的80%。不管你相不相信這點,你到底適不適合這份工作,能不能通過初試,HR在你自我介紹的時候,就已經(jīng)基本決定是否推薦你由用人部門復試了。
但是很多人在自我介紹時會犯錯誤,把自己的學校情況,工作經(jīng)歷,興趣愛統(tǒng)統(tǒng)的介紹給人事;讓他自己判斷你適不適合這份工作。其實你應該很直接地告訴招聘專員:為什么這份工作,你來做才適合。你的競爭力在哪里?等等這些問題。
問題七:“你對我們公司有哪些了解?”
面試官其實想問的是:為什么你非得選擇我們公司?你只要說出公司的地位、總部、規(guī)模等信息即可。接下來,你要開始說細節(jié)了,這很重要!非常簡單但給人印象很深的做法是,看幾個該企業(yè)的宣傳片,然后描繪其中的情節(jié)。
問題八:“說說你離職原因?”
職場中處處是陷阱,問到你的離職原因,你要慎重對待,如果你不止一家企業(yè)經(jīng)歷,那就要回答好幾次這個問題了。這是一個很重要的問題,因為它主要是要考察你的動機、考察你的情商、考察你的取向,還有可能會考察你的性格。
離職原因一般有主觀和客觀之分,主觀原因回答越少越好。最佳的答案一般都是客觀原因。
一般情況下不太好的離職原因有工作業(yè)績不達標,與上級溝通不好,老板與自己的理念不同,你和上司相處不來,公司的制度太苛刻,公司的待遇太差,上級安排工作不合理。等等還有很多。
盡量挑一些你主觀上看似無法避免的原因,比如說:我們公司資金鏈斷裂,可能面臨破產(chǎn);所在部門被合并了,公司讓自己去外地常駐,親人有重大變故。等等還有很多,就不一一列舉了。
問題九:“你的缺點是什么?”
回答這個問題的時候,你一定要避重就輕。首先什么是重?比如說性格方面的問題、人際關系方面的問題、你的工作能力方面的原因。那么什么又是輕呢?比如說,我方向感不太好,不善于理財之類的。等等這些無關痛癢的缺點,或者說與求職關系不大的缺點。
問題十:“你有什么需要向我了解的嗎?”
這個問題一般放在最后階段,面試官問的問題問完了,就會詢問是否要了解的。面對這個問題,不要掉以輕心,因為一般情況下,這個最后的問題可能決定了面試官對你的最終印象。
主要的意思是,你還想了解什么,能幫助你更好留在我們公司?
主要考察考察你的對這家企業(yè)的意向程度,你要是說“沒有”,面試官說不定心里會認為你對這個職位不太感興趣,即使你有一定的經(jīng)驗和技能,但會大打折扣的。這個問題其實給了你表意向的機會,你要很認真地問她:“其實我想了解了解我們公司的工作氛圍是什么樣的?”等等這些問題。
面試應該問面試官哪些問題
第一:可以問面試官你所應聘的部門有多少人員?基本上根據(jù)這個部門員工的人數(shù),你就可以大致了解他們的實力和規(guī)模,甚至是預測出他們這個部門目前處于一個什么樣的水平和狀態(tài)。比如:如果是一個售后部門,面試官說目前該部門有兩名員工,算上你三個,那就說明這個公司的客戶數(shù)量不是那么多,那他們的營收狀況是否有點懸呢?公司還能維持下去多久?或者是客戶很多,那該部門的員工平時工作任務就會比較繁重,加班的情況估計也是很常見。這些都是可以幫助你分析一下,是否到這家公司就職的因素。
第二:問下你應聘部門員工的待遇一般處于什么樣一個水平?這個一般得不到準確的數(shù)據(jù),但是可以得到一個大致的范圍,這樣對你之后的工作待遇,你心里也就提前有一個底了,是去是留,你自己根據(jù)自身情況去把握。
第三:問下應聘部門員工是不是剛?cè)肼毜?當然,這個你可以委婉點去問,比如:咱們部門的員工,也是最近應聘的嗎?要保持微笑的姿勢!如果是剛?cè)肼毜模f明這個部門剛經(jīng)過大換血,或者是新成立的部門,或者是一個流動性很大的部門,這些情況,你自己要去綜合考慮適合自己不適合,我簡單說點,比如:如果是剛大換血,對你來說也許是個機會,跟著新領導雙方都沒有什么包袱,輕裝上陣,好好表現(xiàn)就是領導眼里的骨干了;如果是新成立的部門,就考慮這個新部門的領導水平如何,是否經(jīng)驗豐富,或者是從其他部門隨便分過來的,只因為資歷老在公司,沒什么能力,這些你也要考慮;如果是一個流動性很大的部門,你就要考慮下這個公司是不是有什么問題,要不然員工的流動性不會這么大,這里面肯定是有深層次原因的。那對你來說,流動性太大適不適合你,你也要考慮,有人說有的行業(yè)就是流動性大,這個確實,但是絕大部分行業(yè)都是流動性不大的,所以你要慎重。
第四:問下公司員工的薪資是如何規(guī)定的?基本可以問出來,該公司是否有一個合理、完善的薪酬體系,有完善薪酬體系的公司,面試官會告訴你如何晉升、如何漲工資、如何評比、如何激勵、如何處罰等等,你也可以自己問他。如果沒有完善的薪酬體系,說明該公司的規(guī)章制度還很不完善,以后工作過程中你的薪酬很可能就是老板一句話或者上級領導一句話的事情,而沒有任何合理、客觀的依據(jù)作為參考,這類公司大部分都是人治,而不是法治,至于人治的公司有什么問題,相信大家都會多少知道一點。后期,我也可以給大家分享一下,人治公司到底有哪些深層次的問題。
第五:問下該公司有哪些福利保障?當然,北上廣深,那基本上都是雙休,有加班費,有節(jié)假日、有社保。但是,對于二三線城市的求職者來講,這些待遇很多城市根本做不到,只有少量有規(guī)模和實力的公司才會給你提供,大部分還都是在這方面很不完善,更有一些公司更是連正式合同都沒有,你的去留都是老板一句話的事情,所以,如果你在意這些,一定要問清楚,包括逢年過節(jié),年終獎的事情都要問,要不然最后肯定會讓你寒心的。
面試中需要注意的問題
1、詢問直白急切
求職者急切地問:"我的薪水是多少?"談論薪酬是可以理解的,但是需要主要以場合,在雙方都有意向的情況下,可以委婉地進行詢問。求職者與HR討論薪資問題是正常的,但要選擇時機,而且要委婉,不要粗魯。
2、不可以問的
當HR問到求職者的期望薪資是多少時,求職者直接問對方打算付多少錢是很不禮貌的,很容易冒犯HR。這樣的問題可以委婉地討論,比如:"我認為一個人的薪水與他的能力和貢獻有關。你們公司如何安排這個崗位的工資?"等等,這個更委婉容易使HR接受。
3、不合邏輯的
當面試官讓你介紹自己失敗的經(jīng)歷時,你說沒有或者記不清;當面試官問你的優(yōu)缺點時,你說自己什么都好,沒有缺點;當面試官問你基本技能掌握如何時,你在不知道什么軟件、技能時,說很好很厲害等都是不現(xiàn)實的。
4、本末倒置
當面試結(jié)束時,面試官問:"你有什么問題要問我們嗎?"求職者問道:"這次你招聘了多少人?你在公司的職位是什么?"請務必在面試中把你的職位放好。有些問題會使HR感到不舒服。在面試過程中,求職者必須考慮自己的立場和語氣,這對是否成功有很大的影響。
面試禮儀及技巧
第一度:儀態(tài)儀容要有度
服裝挺括,得體大方又不要鮮艷時髦;袒胸露臂;裝飾合理、搭配得當又不珠光寶器、畫蛇添足;頭發(fā)整齊、略帶素妝又不油頭粉面、濃妝艷抹;儀態(tài)大方、舉止得體又不矯揉造作、故作姿態(tài),要掌握好這些度。
第二度:面試禮儀要有度
彬彬有禮,穩(wěn)文而雅的風度代表了一個人的素質(zhì),是求職的法寶,但是,如果裝腔作勢,唯唯諾諾,就顯得不很得體,所以,要掌握好這個度。
第三度:心理上要有個度
充滿自信是必備條件,自信是敲門磚,自信是一種骨子里的東西,它是不言敗的信心。但是自信不是自負,不是自大,也不是自傲。自驕自傲、非我莫屬,是求職的最大障礙,但是自卑自貶,忐忑不安,也是阻礙成功的最大敵人,二者的結(jié)果都是與機會插肩而過,失之交臂。所以,既要充滿信心,又不要旁若無人,要掌握好這個度.心存疑惑,就會失敗,相信勝利,必定成功。
第四度:準備工作要有度
萬一你被通知要參加面試,一定要作好面試前的全方位六大準備:物資準備、心理準備、研究準備、問題準備、儀表準備,禮儀準備,對面試中的每一個環(huán)節(jié)仔細分析,認真研究,充分的準備可以幫助你鎮(zhèn)定自己。
打有準備之仗,自然心里有底,不慌不忙,充滿必勝的信心??墒?也不要誠惶誠恐,小題大做,物資準備過了頭,顯得很不成熟,問題準備過了頭,結(jié)果,雜亂無章、理不出頭緒。要掌握準備的度。
第五度:介紹優(yōu)缺點要有度
所謂的優(yōu)點是任何你能運用的才干、能力、技藝與人格特質(zhì),這些優(yōu)點也就是你能有貢獻、能繼續(xù)成長的要素,這個優(yōu)勢就是你競爭的法寶。最好的辦法是把自己的優(yōu)點集合起來,一一列舉,形成一個優(yōu)勢。
但是,如果在擇業(yè)中具備種種優(yōu)勢:學習成績好,學校牌子亮,專業(yè)需求旺,求職門路廣,因而盲目自信,志得意滿、當凌絕頂、一覽眾山小,陶醉在已有的光環(huán)之中。在面試中流露出一副咄咄逼人、獨占熬頭的模樣,那就自取滅亡。
第六度:回答問題有度
在面試過程中,最大的困難就是如何回答面試人員的問題了。其實如果你能夠好好準備,加上臨場鎮(zhèn)定的表現(xiàn)和充分發(fā)揮,針對不同類型的問題,要以不同的方式應答,靈活機動,才能有助你輕松過關,爭取求職成功。語速不緊不慢,用詞不溫不火,表情不僵不狂,眼神不呆不滯、舉止不浮不板,要掌握好這些度。
第七度:觀察問題要有度
對周圍的環(huán)境、面試官的表情、態(tài)度毫無察覺,不能隨機應變,不能靈活處理,面試注定失敗。但是,也不能觀察過度,甚至仔細分析、想入非非,結(jié)果,擾亂了回答問題的思路,甚至沒有聽到面試官的問話,那就要亂了陣腳。所以,觀察也要有個度。
第八度:面試后查詢要有個度
不要面試之后,感謝電話一個不打,感謝信一封不寫,不聞不問、靜侯佳音。也不要坐不住板凳,四處打探,甚至電話不斷,讓人討厭。要掌握好這個度。