21個JavaScript 面試中常見算法問題詳解 | 文末限時福利

2021-01-18 開課吧前端團隊

來源 :https://github.com/kennymkchan/interview-questions-in-javascript

闡述下 JavaScript 中的變量提升


所謂提升,顧名思義即是 JavaScript 會將所有的聲明提升到當前作用域的頂部。


這也就意味著我們可以在某個變量聲明前就使用該變量,不過雖然 JavaScript 會將聲明提升到頂部,但是並不會執行真的初始化過程。


闡述下 use strict; 的作用


use strict; 顧名思義也就是 JavaScript 會在所謂嚴格模式下執行,其一個主要的優勢在於能夠強制開發者避免使用未聲明的變量。


對於老版本的瀏覽器或者執行引擎則會自動忽略該指令。


"use strict";
catchThemAll();function catchThemAll() { x = 3.14; return x * x;}


什麼是 Event Bubbling 及如何避免


Event Bubbling 即指某個事件不僅會觸發當前元素,還會以嵌套順序傳遞到父元素中。直觀而言就是對於某個子元素的點擊事件同樣會被父元素的點擊事件處理器捕獲。


避免 Event Bubbling 的方式可以使用event.stopPropagation() 或者 IE 9 以下使用event.cancelBubble。


== 與 === 的區別


=== 也就是所謂的嚴格比較,關鍵的區別在於=== 會同時比較類型與值,而不是僅比較值。


0 == false; 0 === false; 
2 == '2'; 2 === '2';


null 與 undefined 的區別


JavaScript 中,null 是一個可以被分配的值,設置為 null 的變量意味著其無值。


而 undefined 則代表著某個變量雖然聲明了但是尚未進行過任何賦值。


Prototypal Inheritance 與 Classical Inheritance 的區別


在類繼承中,類是不可變的,不同的語言中對於多繼承的支持也不一樣,有些語言中還支持接口、final、abstract 的概念。而原型繼承則更為靈活,原型本身是可以可變的,並且對象可能繼承自多個原型。



找出整型數組中乘積最大的三個數


給定一個包含整數的無序數組,要求找出乘積最大的三個數。


var unsorted_array = [-10, 7, 29, 30, 5, -10, -70];
computeProduct(unsorted_array);
function sortIntegers(a, b) { return a - b;}
function computeProduct(unsorted) { var sorted_array = unsorted.sort(sortIntegers), product1 = 1, product2 = 1, array_n_element = sorted_array.length - 1;
for (var x = array_n_element; x > array_n_element - 3; x--) { product1 = product1 * sorted_array[x]; } product2 = sorted_array[0] * sorted_array[1] * sorted_array[array_n_element];
if (product1 > product2) return product1;
return product2};


尋找連續數組中的缺失數


給定某無序數組,其包含了 n 個連續數字中的 n - 1 個,已知上下邊界,要求以O(n)的複雜度找出缺失的數字。


var array_of_integers = [2, 5, 1, 4, 9, 6, 3, 7];var upper_bound = 9;var lower_bound = 1;
findMissingNumber(array_of_integers, upper_bound, lower_bound);
function findMissingNumber(array_of_integers, upper_bound, lower_bound) {
var sum_of_integers = 0; for (var i = 0; i < array_of_integers.length; i++) { sum_of_integers += array_of_integers[i]; }

upper_limit_sum = (upper_bound * (upper_bound + 1)) / 2; lower_limit_sum = (lower_bound * (lower_bound - 1)) / 2;
theoretical_sum = upper_limit_sum - lower_limit_sum;
return (theoretical_sum - sum_of_integers)}


數組去重


給定某無序數組,要求去除數組中的重複數字並且返回新的無重複數組。


var array = [1, 2, 3, 5, 1, 5, 9, 1, 2, 8];
Array.from(new Set(array));

var array = [1, 2, 3, 5, 1, 5, 9, 1, 2, 8];
uniqueArray(array);
function uniqueArray(array) { var hashmap = {}; var unique = []; for(var i = 0; i < array.length; i++) { if(!hashmap.hasOwnProperty([array[i]])) { hashmap[array[i]] = 1; unique.push(array[i]); } } return unique;}


數組中元素最大差值計算


給定某無序數組,求取任意兩個元素之間的最大差值,注意,這裡要求差值計算中較小的元素下標必須小於較大元素的下標。


譬如[7, 8, 4, 9, 9, 15, 3, 1, 10]這個數組的計算值是 11( 15 - 4 ) 而不是 14(15 - 1),因為 15 的下標小於 1。


var array = [7, 8, 4, 9, 9, 15, 3, 1, 10];
findLargestDifference(array);
function findLargestDifference(array) {

if (array.length <= 1) return -1;

var current_min = array[0]; var current_max_difference = 0;

for (var i = 1; i < array.length; i++) { if (array[i] > current_min && (array[i] - current_min > current_max_difference)) { current_max_difference = array[i] - current_min; } else if (array[i] <= current_min) { current_min = array[i]; } }
if (current_max_difference <= 0) return -1;
return current_max_difference;}


數組中元素乘積


給定某無序數組,要求返回新數組 output ,其中 output[i] 為原數組中除了下標為 i 的元素之外的元素乘積,要求以 O(n) 複雜度實現:


var firstArray = [2, 2, 4, 1];var secondArray = [0, 0, 0, 2];var thirdArray = [-2, -2, -3, 2];
productExceptSelf(firstArray); productExceptSelf(secondArray); productExceptSelf(thirdArray);
function productExceptSelf(numArray) { var product = 1; var size = numArray.length; var output = [];
for (var x = 0; x < size; x++) { output.push(product); product = product * numArray[x]; }
var product = 1; for (var i = size - 1; i > -1; i--) { output[i] = output[i] * product; product = product * numArray[i]; }
return output;}


數組交集


給定兩個數組,要求求出兩個數組的交集,注意,交集中的元素應該是唯一的。


var firstArray = [2, 2, 4, 1];var secondArray = [1, 2, 0, 2];
intersection(firstArray, secondArray);
function intersection(firstArray, secondArray) {
var hashmap = {}; var intersectionArray = [];
firstArray.forEach(function(element) { hashmap[element] = 1; });
secondArray.forEach(function(element) { if (hashmap[element] === 1) { intersectionArray.push(element); hashmap[element]++; } });
return intersectionArray;
}


字 符 串


顛倒字符串


給定某個字符串,要求將其中單詞倒轉之後然後輸出,譬如"Welcome to this Javascript Guide!" 應該輸出為 "emocleW ot siht tpircsavaJ !ediuG"。


var string = "Welcome to this Javascript Guide!";
var reverseEntireSentence = reverseBySeparator(string, "");
var reverseEachWord = reverseBySeparator(reverseEntireSentence, " ");
function reverseBySeparator(string, separator) { return string.split(separator).reverse().join(separator);}


亂序同字母字符串


給定兩個字符串,判斷是否顛倒字母而成的字符串,譬如Mary與Army就是同字母而順序顛倒:


var firstWord = "Mary";var secondWord = "Army";
isAnagram(firstWord, secondWord);
function isAnagram(first, second) { var a = first.toLowerCase(); var b = second.toLowerCase();
a = a.split("").sort().join(""); b = b.split("").sort().join("");
return a === b;}


會問字符串


判斷某個字符串是否為回文字符串,譬如racecar與race car都是回文字符串:


isPalindrome("racecar"); isPalindrome("race Car"); 
function isPalindrome(word) { var lettersOnly = word.toLowerCase().replace(/\s/g, "");
return lettersOnly === lettersOnly.split("").reverse().join("");}


棧與隊列


使用兩個棧實現入隊與出隊


var inputStack = []; var outputStack = []; 
function enqueue(stackInput, item) { return stackInput.push(item);}
function dequeue(stackInput, stackOutput) { if (stackOutput.length <= 0) { while(stackInput.length > 0) { var elementToOutput = stackInput.pop(); stackOutput.push(elementToOutput); } }
return stackOutput.pop();}


判斷大括號是否閉合


創建一個函數來判斷給定的表達式中的大括號是否閉合:


var expression = "{{}}{}{}"var expressionFalse = "{}{{}";
isBalanced(expression); isBalanced(expressionFalse); isBalanced("");
function isBalanced(expression) { var checkString = expression; var stack = [];
if (checkString.length <= 0) return true;
for (var i = 0; i < checkString.length; i++) { if(checkString[i] === '{') { stack.push(checkString[i]); } else if (checkString[i] === '}') { if (stack.length > 0) { stack.pop(); } else { return false; } } }
if (stack.pop()) return false; return true;}


遞 歸


二進位轉換


通過某個遞歸函數將輸入的數字轉化為二進位字符串:


decimalToBinary(3); decimalToBinary(8); decimalToBinary(1000); 
function decimalToBinary(digit) { if(digit >= 1) { if (digit % 2) { return decimalToBinary((digit - 1) / 2) + 1; } else { return decimalToBinary(digit / 2) + 0; } } else { return ''; }}


二分搜索


function recursiveBinarySearch(array, value, leftPosition, rightPosition) {    if (leftPosition > rightPosition) return -1;
var middlePivot = Math.floor((leftPosition + rightPosition) / 2); if (array[middlePivot] === value) { return middlePivot; } else if (array[middlePivot] > value) { return recursiveBinarySearch(array, value, leftPosition, middlePivot - 1); } else { return recursiveBinarySearch(array, value, middlePivot + 1, rightPosition); }}

數 字


判斷是否為 2 的指數值


isPowerOfTwo(4); isPowerOfTwo(64); isPowerOfTwo(1); isPowerOfTwo(0); isPowerOfTwo(-1); 
function isPowerOfTwo(number) {
return number & (number - 1) === 0;}
function isPowerOfTwoZeroCase(number) { return (number !== 0) && ((number & (number - 1)) === 0);}

《web移動端交互開發實戰秘笈》

46節錄播視頻形式

限時拼團價1.68,快來薅羊毛!



相關焦點

  • JavaScript 面試中常見算法問題詳解
    JavaScript 面試中常見算法問題詳解,翻譯自 https://github.com/kennymkchan/interview-questions-in-javascript
  • 《Python程式設計師面試算法寶典》PDF超清版開源了文末附下載方式
    、分類歸納,提煉出算法面試的各種應對技巧,是一本Python程式設計師算法面試的圖書寶典。√ 採用抽絲剝繭式分析,深入解釋計算機科學的底層邏輯——算法及原理。√ 包括60多個算法題目,針對性強,拿來就用。通過實戰學習解題思路。《Python程式設計師面試寶典》是一本介紹Python程式設計師面試的圖書寶典。
  • 【福利】面試真題解密
    這正是課程組多年來收集的各學院、各學科的面試真題、主考官在現場所給的提示、以及課程組精心編制的參考答案。在這篇推送裡,小編就來和大家分享幾道曾經出現的面試題。限於篇幅,推送的內容比較有限。如果學弟學妹們對答案或考官的點評感興趣的話,可以單獨給小編留言,我們會安排老師在線下與你們進行一對一的交流。數學1.
  • 【產品面試】常見5個面試問題(十六
    ,這麼答面試官一眼就知道你想做話題終結者。 常見比較聰明的回答有這些:據理力爭、找上司來幫忙、說服意見相同者以團隊力量來說服,這樣的答案顯然都漏洞百出,不僅不加分反而減分。 標準答案只有四個字:「數據分析」,數據分析是到此為止最科學、最高效、最富有說服力的決策方式 ,你可以說我會通過數據分析來證明我的觀點,突出「數據分析」!
  • javascript在自動化測試項目中的應用「軟體測試開發入門教程」
    比如說我今天分享的主題是javascript在自動化測試中的應用有些朋友說我之前講的自動化測試的東西,需要消化很久,有一定的難度,意思就是說我動不動就講測試框架,測試開發是不是會有這樣的感覺?比如今天分享的javascript,大家做軟體測試有沒有用過?
  • 新媒體運營面試常見問題及回答技巧 面試中個人優缺點回答技巧
    新媒體作為熱門行業,求職的人數自然也很多,那麼要想在眾多求職者中獲得HR的青睞,就得好好「做功課」,特別是面試。為什麼說面試重要呢?因為做新媒體運營的人,文採都不會差,簡歷上的信息自然也會描述的比較完美,HR在篩選簡歷時,只要你簡歷上的工作經歷和相關技能都符合崗位,一般都會讓你來面試。面試才是重頭戲,面試官在面試時會問各種各樣的問題,從而確定誰是最佳人選。
  • 文末有福利
    文末有福利 2020-09-29 07:21 來源:澎湃新聞·澎湃號·政務
  • 如何準備面試,這裡有美國留學面試中常見的十大問題!
    出國留學,不僅要面對各種考試,更讓人頭疼的是「沒有標準答案」的面試。雖然GPA和標化成績總是佔據了大多數人的話題,但是當外在條件相當,文書中的實踐經歷也半斤八兩時,面試就成了至關重要的環節。  今年的申請季,很多大學都加了面試的環節,以此來考察申請者。
  • 知名專家科普來襲——帶你正確認識「蝙蝠和貉」(文末有福利)
    知名專家科普來襲——帶你正確認識「蝙蝠和貉」(文末有福利) 2020-08-27 17:12 來源:澎湃新聞·澎湃號·政務
  • JavaScript中的「黑話」
    而本文涉及到的「黑話」,其實是一些利用語言的特徵使用的一些不常見的奇淫技巧,JavaScript的語法是十分簡單靈活的,在項目中建議大家遵從ESLint規範編寫可維護性的代碼,各路神仙們也應該進行自我約束,畢竟「黑話」也並不全是什麼好的東西,如果很多話可以直接講,何必拐彎抹角的去說呢?
  • 算法中的微積分:5大函數求導公式讓你在面試中脫穎而出
    事實上,所有機器學習算法的本質都是數學問題,無論是支持向量機、主成分分析還是神經網絡最終都歸結為對偶優化、譜分解篩選和連續非線性函數組合等數學問題。只有徹底理解數學,才能正真掌握這些機器學習算法。Python中的各種資料庫能幫助人們利用高級算法來完成一些簡單步驟。
  • 福利丨「鄉土動物限時尋」活動來襲,4組親子免費活動名額限時搶
    福利丨「鄉土動物限時尋」活動來襲,4組親子免費活動名額限時搶 2020-07-08 11:08 來源:澎湃新聞·澎湃號·政務
  • 現場|國產「阿嬌」在新家交付(文末福利)
    值得一提的是,這也是中國商飛首次在其新建的江西生產試飛中心交付飛機,這座生產試飛中心坐落於南昌高新區航空城的瑤湖機場旁,是商飛除上海大場及祝橋基地以外的首個生產製造機構此外,同樣位於南昌航空城的航空工業洪都還是C919飛機前機身及中後機身的唯一供應商。
  • JavaScript數組 - 引用詳解
    基本數據類型詳解在學習數組引用詳解前,我們先來看基本數據類型的詳解舉個小例子:我們聲明一個a = 10;然後聲明一個函數,這個函數裡面有個參數為a把這個參數的a改成5,a = 5; 並且再加上alert(a);函數外我們先去alert(a);再調用這個函數把a寫在裡面傳進去
  • 網際網路公司最常見的面試算法題大集合
    很多求職者都會在LeetCode刷上一遍,面試官也喜歡在上面挑選各類題目。LeetCode是一個美國的在線編程網站,收集了各個大廠的筆試面試題,對找工作的畢業生和開發者來說,非常有價值。不過LeetCode上面的題目很多都是考察應聘者對基礎知識的應用,適合進行練習編程基礎或者準備面試。
  • 程式設計師面試題,200億個數字找中位數,不給分桶算法,怎麼辦?
    海量數據裡面如何尋找一堆數字的中位數,是一道非常常見的面試題。據稱,這個題目是騰訊前首席技術執行官Tony推崇的一個面試題,被加入的騰訊的面試題題庫。今天我們就來討論下這個題目,有一個存放著200億個數字的文件,存放著32位整型,可能會有重複的數字,現在想從這堆數字中找到他們的中位數。
  • 2020 圖算法工程師面試基礎、要點
    為你總結面試必備的知識要點,助你面試成功。 這段時間面試連連,幾輪下來的感受就是,好點兒的公司對細節摳的很細,希望求職者能夠對使用的算法以及這個算法的其它觸類旁通的領域都能夠有系統的理解。
  • 數據科學和機器學習面試問題集錦
    在過去的幾個月裡,我面試了許多公司涉及數據科學和機器學習的初級職位。介紹一下我自己,以讓你對我有一定了解。我還有最後幾個月就研究生畢業,我的碩士是機器學習和計算機視覺,我之前的大部分經驗是研究/學術,但在一個早期創業公司待過8個月(與機器學習無關)。這些角色包括數據科學、通用機器學習和專精自然語言處理及計算機視覺。
  • HR面試419名醫學類畢業生後總結出10個常見問題,你中了幾個?
    小編跟隨領導近幾年也參加了不少醫學院校的校招,對其中參加面試後落選的400多個應屆畢業生所存在的共性問題,進行了分析整理,總結出10個常見問題,真心希望對正在求職路上的你有所幫助。也許是醫學類專業性比較強的緣故,我們在面試時提的一些與醫學類專業關係專業不大但又與今後工作息息相關的問題時,較少的時候能獲得滿意回答。例如在提問「你單身嗎?還是準備畢業後就結婚了?你近期有找女朋友的計劃嗎?」之類的問題時,其實我們並不是想查戶口,也不是想給你介紹對象,而是想從你的問答中了解到你能否具備長期穩定工作的基本條件。
  • (文內有福利)
    6 周年之際,我們請到了華東理工大學出版社,和他們一起聊了聊高效辦公的心得體會,文末更有聯名福利等著你~華東理工大學出版社(簡稱「華理社」)成立於 1986 年,是由教育部主管、華東理工大學主辦的綜合性大學出版社。