BAT做爲中國三大最大互聯網公司,是每一個程序員求之不得的工做環境,比如高中生高考的目的是清華北大復旦同樣,因此每一個年輕程序員都應該嘗試進入BAT工做。node
編寫一個高效的算法來搜索 m x n 矩陣 matrix 中的一個目標值 target。該矩陣具備如下特性:程序員
示例:面試
現有矩陣 matrix 以下:算法
[ [1, 4, 7, 11, 15], [2, 5, 8, 12, 19], [3, 6, 9, 16, 22], [10, 13, 14, 17, 24], [18, 21, 23, 26, 30] ]
二維數組是有規律的:右上角的數字是一列中最小的、一行中最大的,經過這個數字和 target 進行對比,能夠將一行或者一列做爲候選區域排出,那麼 target 可能存在的範圍縮小,最終得出結果。數組
public Boolean searchMatrix(int[][] matrix, int target) { if (matrix.length == 0) { return false; } for (int i = 0, j = matrix[0].length - 1; i < matrix.length && j >= 0; ) { if (matrix[i][j] > target) { j--; } else if (matrix[i][j] < target) { i++; } else { return true; } } return false; }
請實現一個函數,將一個字符串中的每一個空格替換成「%20」。例如,當字符串爲We Are Happy.則通過替換以後的字符串爲 We%20Are%20Happy。app
public String replaceSpace(StringBuffer str) { char[] chars = str.toString().toCharArray(); StringBuilder res = new StringBuilder(); for (char c : chars) { if (c == ' ') res.append("%20"); else res.append(c); } return res.toString(); }
輸入一個鏈表,按鏈表值從尾到頭的順序返回一個ArrayList。函數
public ArrayList<Integer> printListFromTailToHead(ListNode listNode) { LinkedList<Integer> stack = new LinkedList<>(); while (listNode != null) { stack.addLast(listNode.val); listNode = listNode.next; } ArrayList<Integer> res = new ArrayList<>(); while (!stack.isEmpty()) { res.add(stack.pollLast()); } return res; }
public ArrayList<Integer> printListFromTailToHead(ListNode listNode) { ArrayList<Integer> res = new ArrayList<>(); print(res,listNode); return res; } private void print(ArrayList<Integer> res, ListNode listNode) { if (listNode == null) return; print(res, listNode.next); res.add(listNode.val); }
輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列{1,2,4,7,3,5,6,8}和中序遍歷序列{4,7,2,1,5,3,8,6},則重建二叉樹並返回。ui
public TreeNode reConstructBinaryTree(int[] pre, int[] in) { Map<Integer, Integer> preIndex = new HashMap<>(); for (int i = 0; i < pre.length; i++) { preIndex.put(pre[i], i); } return buildTree(preIndex, in, 0, in.length - 1); } private TreeNode buildTree(Map<Integer, Integer> preIndex, int[] in, int start, int end) { if (start == end) { return new TreeNode(in[start]); } int indexOfRoot = start; for (int i = start; i <= end; i++) { if (preIndex.get(in[i]) < preIndex.get(in[indexOfRoot])) { indexOfRoot = i; } } TreeNode root = new TreeNode(in[indexOfRoot]); if (start <= indexOfRoot - 1) root.left = buildTree(preIndex, in, start, indexOfRoot - 1); if (indexOfRoot + 1 <= end) root.right = buildTree(preIndex, in, indexOfRoot + 1, end); return root; }
用兩個棧來實現一個隊列,完成隊列的 Push 和 Pop 操做。 隊列中的元素爲int類型。spa
至關於將兩個 stack 拼接:-> stack1 <::> stack2 ->設計
Stack<Integer> pushStack = new Stack<>(); Stack<Integer> popStack = new Stack<>(); public void push(int node) { pushStack.push(node); } public int pop() { if (popStack.isEmpty()) { while (!pushStack.isEmpty()) { popStack.push(pushStack.pop()); } } if (popStack.isEmpty()) return -1; else return popStack.pop(); }
把一個數組最開始的若干個元素搬到數組的末尾,咱們稱之爲數組的旋轉。 輸入一個非減排序的數組的一個旋轉,輸出旋轉數組的最小元素。 例如數組{3,4,5,1,2}爲{1,2,3,4,5}的一個旋轉,該數組的最小值爲1。 NOTE:給出的全部元素都大於0,若數組大小爲0,請返回0。
public int minNumberInRotateArray(int[] array) { if (array.length == 0) { return 0; } int start = 0, end = array.length - 1; while (end - start != 1) { int mid = (start + end) / 2; if (array[mid] >= array[start]) { start = mid; } if (array[mid] <= array[end]) { end = mid; } } return array[end]; }
你們都知道斐波那契數列,如今要求輸入一個整數n,請你輸出斐波那契數列的第n項(從0開始,第0項爲0)。n<=39
public int Fibonacci(int n) { if (n == 0) { return 0; } if (n == 1) { return 1; } int l = 1, ll = 0; for (int i = 2; i <= n; i++) { int t = ll + l; ll = l; l = t; } return l; }
輸入一個整數,輸出該數二進制表示中1的個數。其中負數用補碼錶示。
>>>
爲無符號右移,>>
爲有符號右移,當 n 爲負數是會增長多餘的1public int NumberOf1(int n) { int mask = 0x01; int res = 0; int t = n; while (t != 0) { if ((t & mask) == 1) { res++; } t = t >>> 1; } return res; }
給定一個 double 類型的浮點數 base 和 int 類型的整數 exponent 。求 base 的 exponent 次方。
$$a^n = a^{n/2} * a^{n/2}$$
$$a^n = a^{n/2} * a^{n/2} * a$$
public double Power(double base, int exponent) { if (base == 0) { return 0; } if (base == 1) { return 1; } int t_exponent = Math.abs(exponent); double t = PositivePower(base, t_exponent); return exponent > 0 ? t : 1 / t; } private double PositivePower(double base, int exponent) { if (exponent == 0) { return 1; } if (exponent == 1) { return base; } double t = PositivePower(base, exponent >> 1); t *= t; if ((exponent & 0x01) == 1) { t *= base; } return t; }
輸入n,打印出 1 到最大的 n 位十進制數。好比輸入3,則打印出一、二、3 直到最大的 3 位數 999。
解題思路
public void PrintN(int n) { if (n <= 0) { return; } String res = "0"; while (true) { Boolean all9 = true; res = Plus(res, 1); System.out.println(res); for (int i = 0; i < res.length(); i++) { if (res.charAt(i) != '9') { all9 = false; break; } } if (all9 && res.length() == n) { break; } } } private String Plus(String t, int i) { char[] chars = t.toCharArray(); StringBuilder res = new StringBuilder(); chars[chars.length - 1] += i; Boolean flag = false; for (int j = chars.length - 1; j >= 0; j--) { int a = chars[j]; if (flag) { a++; flag = false; } if (a > '9') { flag = true; a = a - '9' + '0' - 1; } res.append((char) a); } if (flag) { res.append('1'); } return res.reverse().toString(); }
給定單向鏈表的頭指針以及待刪除的指針,定義一個函數在 O(1) 的時間複雜度下刪除
public void O1DeleteNode(ListNode head, ListNode needDelete) { if (needDelete.next != null) { ListNode next = needDelete.next.next; needDelete.val = needDelete.next.val; needDelete.next = next; } else { ListNode cursor = head; while (cursor != null) { if (cursor.next == needDelete) break; cursor = cursor.next; } if (cursor == null) return; cursor.next = needDelete.next; } }
輸入一個整數數組,實現一個函數來調整該數組中數字的順序,使得全部的奇數位於數組的前半部分,全部的偶數位於數組的後半部分,並保證奇數和奇數,偶數和偶數之間的相對位置不變。
public void reOrderArray(int[] array) { if (array.length <= 1) { return; } for (int i = array.length - 1; i >= 0; i--) { for (int j = i; j < array.length - 1; j++) { if (array[j] % 2 == 0 && array[j + 1] % 2 == 1) swap(array, j, j + 1); } } } private void swap(int[] array, int a, int b) { int t = array[a]; array[a] = array[b]; array[b] = t; }
輸入一個鏈表,輸出該鏈表中倒數第k個結點。
public ListNode FindKthToTail(ListNode head, int k) { if (head == null) { return null; } ListNode cursor = head; ListNode cursorK = head; int i = 0; while (cursorK != null) { cursorK = cursorK.next; if (i >= k) { cursor = cursor.next; } i++; } if (i < k) { return null; } return cursor; }
輸入一個鏈表,反轉鏈表後,輸出新鏈表的表頭。
public ListNode ReverseList(ListNode head) { if (head == null || head.next == null) { return head; } ListNode pre = head, cur = head.next, next; pre.next = null; while (cur != null) { next = cur.next; cur.next = pre; pre = cur; cur = next; } return pre; }
面試題還有不少,可是本文章限於篇幅,只分享15到一線互聯網面試真題;關於本人所設計到的面試題,本人都已經整理成一份完整的PDF面試題集合,現免費分享給各位有須要的Java工程師朋友,點擊下方傳送門便可免費領取喲