近年來T行業就業者愈來愈多,有關於編程行業的高薪工做也變得愈來愈難找,競爭力愈來愈大,想要在衆多的應聘者當中脫穎而出,面試題和筆試題必定要多加研究和琢磨,如下記錄的是本身的面試過程之中遇到的一些比較經典的筆試題。javascript
我找工做面試的時候沒有太多的經驗,也走了很多的彎路,可是有所記錄,有所總結如今分享出來,不少企業的面試題並無那麼難,大多數都是來源於網絡,只要本身準備充分,將網絡上的各種面試題一一掌握,那麼在面試中,就能作到成竹在胸。前端
記錄滴滴打車一次面試JavaScript的經典面試題,當時回答不全,特地回來在百度上找了一些權威的答案,後來仔細想一想,題目也是萬變不離其宗好,幾乎都是從多方位各角度考察一個知識點的。java
如下代碼的結果是什麼?請解釋你的答案。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 Rosa
和John Doe
。緣由是在javascript中,一個函數的語境,也就是this
這個關鍵詞引用的,依賴於函數是如何調用的,不是如何定義的。github
在第一個console.log()
調用中, getFullname()
是做爲obj.prop
的函數被調用的。所以,這裏的語境指向後者而且函數返回對象的 fullname
屬性。相反,當 getFullname()
被指定爲test
的變量,那個語境指向全局對象(window
)。由於test
至關於設置爲全局對象的屬性。由於這個緣由,函數返回window
的一個fullname
屬性,這在這個案例中是在代碼片斷中第一行設置的。面試
題目:斐波那契數列指的是相似於如下的數列:編程
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 })()
在 String
對象上定義一個 repeatify
函數。這個函數接受一個整數參數,來明確字符串須要重複幾回。這個函數要求字符串重複指定的次數。舉個例子:
1. console.log('hello'.repeatify(3));
1. console.log('hello'.repeatify(3));
應該打印出hellohellohello
.
一個可行的作法以下:
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(''), ''); }
輸入描述:輸入爲整數序列,數字用空格分隔。例:-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 */
輸入描述:輸入的第一行爲整數序列,數字用空格分隔。例: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
福利二:微信小程序入門與實戰全套詳細視頻教程
領取方式:
若是須要學習視頻,歡迎關注 【編程微刊】微信公衆號,回覆【領取資源】一鍵領取如下全部乾貨資源,獲取更多有用技術乾貨、文檔資料。全部文檔會持續更新,歡迎關注一塊兒成長!
原文做者:祈澈姑娘
原文連接:https://www.jianshu.com/u/05f416aefbe1
創做不易,轉載請告知
90後前端妹子,愛編程,愛運營,愛折騰。堅持總結工做中遇到的技術問題,堅持記錄工做中所所思所見,歡迎你們一塊兒探討交流。