JavaScript經典面試題(二)

前言:

近年來T行業就業者愈來愈多,有關於編程行業的高薪工做也變得愈來愈難找,競爭力愈來愈大,想要在衆多的應聘者當中脫穎而出,面試題和筆試題必定要多加研究和琢磨,如下記錄的是本身的面試過程之中遇到的一些比較經典的筆試題。javascript

我找工做面試的時候沒有太多的經驗,也走了很多的彎路,可是有所記錄,有所總結如今分享出來,不少企業的面試題並無那麼難,大多數都是來源於網絡,只要本身準備充分,將網絡上的各種面試題一一掌握,那麼在面試中,就能作到成竹在胸。前端

記錄滴滴打車一次面試JavaScript的經典面試題,當時回答不全,特地回來在百度上找了一些權威的答案,後來仔細想一想,題目也是萬變不離其宗好,幾乎都是從多方位各角度考察一個知識點的。java

一: this在javascript中是如何工做的

如下代碼的結果是什麼?請解釋你的答案。git

var fullname = 'John Doe'; var obj = { fullname: 'Colin Ihrig', prop: { fullname: 'Aurelio De Rosa', getFullname: function() { return this.fullname; } } }; console.log(obj.prop.getFullname()); var test = obj.prop.getFullname; console.log(test()); var fullname = 'John Doe'; var obj = { fullname: 'Colin Ihrig', prop: { fullname: 'Aurelio De Rosa', getFullname: function() { return this.fullname; } } }; console.log(obj.prop.getFullname()); var test = obj.prop.getFullname; console.log(test());

答案

代碼打印了Aurelio De RosaJohn Doe。緣由是在javascript中,一個函數的語境,也就是this這個關鍵詞引用的,依賴於函數是如何調用的,不是如何定義的。github

在第一個console.log()調用中, getFullname()是做爲obj.prop的函數被調用的。所以,這裏的語境指向後者而且函數返回對象的 fullname屬性。相反,當 getFullname() 被指定爲test的變量,那個語境指向全局對象(window)。由於test至關於設置爲全局對象的屬性。由於這個緣由,函數返回window的一個fullname屬性,這在這個案例中是在代碼片斷中第一行設置的。面試

二: 記憶化斐波那契函數(Memoization)

題目:斐波那契數列指的是相似於如下的數列:編程

1, 1, 2, 3, 5, 8, 13, ....小程序

也就是,第 n 個數由數列的前兩個相加而來:f(n) = f(n - 1) + f(n -2)微信小程序

請你完成 fibonacci 函數,接受 n 做爲參數,能夠獲取數列中第 n 個數,例如:數組

fibonacci(1) // => 1 fibonacci(2) // => 1 fibonacci(3) // => 2 fibonacci(1) // => 1 fibonacci(2) // => 1 fibonacci(3) // => 2

...

測試程序會從按順序依次獲取斐波那契數列中的數,請注意程序不要超時,也不要添加額外的全局變量。

本題來源:《JavaScript 語言精髓》

答案:

const fibonacci = ((memo = [0, 1]) => { const fib = (n) => { let result = memo[n] if (typeof result !== "number") { result = fib(n - 1) + fib(n - 2) memo[n] = result } return result } return fib })() const fibonacci = ((memo = [0, 1]) => { const fib = (n) => { let result = memo[n] if (typeof result !== "number") { result = fib(n - 1) + fib(n - 2) memo[n] = result } return result } return fib })()

三: 建立 「原生(native)」 方法

String 對象上定義一個 repeatify 函數。這個函數接受一個整數參數,來明確字符串須要重複幾回。這個函數要求字符串重複指定的次數。舉個例子:

JavaScript 代碼:
1. console.log('hello'.repeatify(3)); 1. console.log('hello'.repeatify(3));

應該打印出hellohellohello.

答案

一個可行的作法以下:

JavaScript 代碼:
 String.prototype.repeatify = String.prototype.repeatify || function(times) { var str = ''; for (var i = 0; i < times; i++) { str += this; } return str; }; String.prototype.repeatify = String.prototype.repeatify || function(times) { var str = ''; for (var i = 0; i < times; i++) { str += this; } return str; };

四:同字母異序

同字母異序指的是兩個字符串字母種類和字母的數量相同,可是順序可能不一樣。

完成 isAnagram,接受兩個字符串做爲參數,返回true 或者 false 表示這兩個字符串是否同字母異序。例如:

isAnagram("anagram", "nagaram") // => return true.
isAnagram("rat", "car") // => return false.

(本題來源:github, LeetCode)

答案:

const isAnagram = (str1, str2) => /* TODO */ { return !str1.split('').sort().join('').replace(str2.split('').sort().join(''), ''); } const isAnagram = (str1, str2) => /* TODO */ { return !str1.split('').sort().join('').replace(str2.split('').sort().join(''), ''); }

五:給定無序整數序列,求連續子串最大和。(滴滴出行2018校園招聘內推筆試)

輸入描述:輸入爲整數序列,數字用空格分隔。例:-23 17 – 7 11 -2 1 -34
輸出描述:輸出位子序列的最大和。例:21

答案:

思路:動規思想,更新遍歷到當前位置的最大值,而且每次都判斷一下是否大於答案,注意全爲負數和一個數這些特殊狀況。遍歷依次,求從第一個數開始累加的和,並記錄最大值和最小值,最小值和最大值的差就是子序列最大的和。

 using namespace std; int max(const int& a, const int& b) { return a>b?a:b; } int main() { int a[10005]; int count = 0; while(cin >> a[count++]); count--; int ans = 0; int result = a[0]; for(int i = 0; i < count; ++i) { ans = max(ans+a[i], a[i]); result = max(result, ans); } cout << result << endl; return 0; } /* -23 17 -7 11 -2 1 -34 */ using namespace std; int max(const int& a, const int& b) { return a>b?a:b; } int main() { int a[10005]; int count = 0; while(cin >> a[count++]); count--; int ans = 0; int result = a[0]; for(int i = 0; i < count; ++i) { ans = max(ans+a[i], a[i]); result = max(result, ans); } cout << result << endl; return 0; } /* -23 17 -7 11 -2 1 -34 */

六:給定無序整數序列,求其中第K大的數。

輸入描述:輸入的第一行爲整數序列,數字用空格分隔。例:45 67 33 21
輸入的第二行一個整數K,K在數組長度範圍之內。例:2

答案:(來源於博客,侵刪)

採用兩個指針left和right,分別從數組起始和末尾開始查找,知足left左側的元素小於等於current值,right右側的元素大於等於current,直至left = right。返回left指針位置,根據left和K的關係,肯定下一步的查找範圍。

package cn.thinking17; import java.io.*; import java.util.*; public class NOK { public static void main(String args[]) { Scanner in = new Scanner(System.in); String nextLine = in.nextLine(); int kth = in.nextInt(); String[] splits = nextLine.split(" "); int[] numbers = new int[splits.length]; for (int i = 0; i < numbers.length; i++) { numbers[i] = Integer.parseInt(splits[i]); } System.out.println(kthLargestElement(2, numbers)); } public static int kthLargestElement(int k, int[] nums) { if (nums == null || nums.length == 0) { return 0; } if (k <= 0) { return 0; } return helper(nums, 0, nums.length - 1, nums.length - k + 1); } public static int helper(int[] nums, int l, int r, int k) { if (l == r) { return nums[l]; } int position = partition(nums, l, r); if (position + 1 == k) { return nums[position]; } else if (position + 1 < k) { return helper(nums, position + 1, r, k); } else { return helper(nums, l, position - 1, k); } } public static int partition(int[] nums, int l, int r) { int left = l, right = r; int pivot = nums[left]; while (left < right) { while (left < right && nums[right] >= pivot) { right--; } nums[left] = nums[right]; while (left < right && nums[left] <= pivot) { left++; } nums[right] = nums[left]; } nums[left] = pivot; return left; } } package cn.thinking17; import java.io.*; import java.util.*; public class NOK { public static void main(String args[]) { Scanner in = new Scanner(System.in); String nextLine = in.nextLine(); int kth = in.nextInt(); String[] splits = nextLine.split(" "); int[] numbers = new int[splits.length]; for (int i = 0; i < numbers.length; i++) { numbers[i] = Integer.parseInt(splits[i]); } System.out.println(kthLargestElement(2, numbers)); } public static int kthLargestElement(int k, int[] nums) { if (nums == null || nums.length == 0) { return 0; } if (k <= 0) { return 0; } return helper(nums, 0, nums.length - 1, nums.length - k + 1); } public static int helper(int[] nums, int l, int r, int k) { if (l == r) { return nums[l]; } int position = partition(nums, l, r); if (position + 1 == k) { return nums[position]; } else if (position + 1 < k) { return helper(nums, position + 1, r, k); } else { return helper(nums, l, position - 1, k); } } public static int partition(int[] nums, int l, int r) { int left = l, right = r; int pivot = nums[left]; while (left < right) { while (left < right && nums[right] >= pivot) { right--; } nums[left] = nums[right]; while (left < right && nums[left] <= pivot) { left++; } nums[right] = nums[left]; } nums[left] = pivot; return left; } }

文末福利:

福利一:前端,Java,產品經理,微信小程序,Python等資源合集大放送:https://www.jianshu.com/p/e8197d4d9880
福利二:微信小程序入門與實戰全套詳細視頻教程

image

領取方式:
若是須要學習視頻,歡迎關注 【編程微刊】微信公衆號,回覆【領取資源】一鍵領取如下全部乾貨資源,獲取更多有用技術乾貨、文檔資料。全部文檔會持續更新,歡迎關注一塊兒成長!

原文做者:祈澈姑娘
原文連接:https://www.jianshu.com/u/05f416aefbe1
創做不易,轉載請告知

90後前端妹子,愛編程,愛運營,愛折騰。堅持總結工做中遇到的技術問題,堅持記錄工做中所所思所見,歡迎你們一塊兒探討交流。

相關文章
相關標籤/搜索