字節跳動 Java一面面經

字節跳動Java一面面經


實在是自己太沉,跳不動啊
時間:2019.08.19

知識點

1、Java集合類(源碼!!!HashMap、HashSet、HashTable、ConcurrentHashMap)。
2、線程安全,synchronized。
3、JVM的一系列命令。
4、數據庫的索引、引擎、隔離級別、怎麼查看死鎖,共享鎖排他鎖,樂觀鎖。
5、Https爲什麼安全,流程是什麼。
6、線程的狀態,Thread的sleep方法,yield方法。
7、Java鎖,完全不會系列。

算法題

思路部分源於面試後的查詢。

1、一堆數字,其中有一個數字的數量超過了一半,找出這個數字。

思路:(1)遍歷,哈希記錄,沒啥可說的。
(2)排序:找中位數。
(3)快速查找的思路:長度爲n,如果所選數字的位置在n/2處,則爲中位數,輸出即可;如果其位置大於n/2,則在左邊繼續找,否則在右邊繼續找。
(4)根據數組的特點,很nice的思路:計數,首先從頭開始,記錄開始數字並記錄次數,下一個數字如果重複則次數加一,不重複數字減一。如果次數爲0了,重新記錄下一次出現的數字,並記錄其次數爲1,繼續計數。由於有一個數字出現的次數大於一半,遍歷到最後的時候,剩下的只能是次數大於一半的那個數字。

2、一個數組,只有一個數字出現奇數次,其餘數字出現偶數次,求出現奇數次的數字。

思路:異或,將所有數字進行異或,出現偶數次的數字異或結果爲0,出現奇數次的數字x可以看作是偶數次+1次,其偶數次的異或結果爲0,0異或剩下的一個x結果爲x。

3、輸出數字的全排列,比如:
輸入:3
輸出:
[1, 2, 3]
[1, 3, 2]
[2, 1, 3]
[2, 3, 1]
[3, 1, 2]
[3, 2, 1]

思路:遞歸,以3爲例,可以看作是:第一個數字是1和其他兩個數字的全排列+第一個數字是2和其他兩個數字的全排列+第一個數字是3和其他兩個數字的全排列。
代碼:

import java.util.ArrayList;
import java.util.Arrays;

public class Main {
	public ArrayList<int[]> result = new ArrayList<int[]>();
	/*
	 * 數組的全排列
	 */
	public void allPerm(int[] nums, int start, int len) {
		if(start >= len-1) {
			// 也可以在此處直接輸出
			// System.out.println(Arrays.toString(nums));
			result.add(nums.clone());  // 此處不能直接添加nums,如果是nums,添加就是nums的引用,可以去掉clone()看一下輸出
			return;
		}
		for(int i = start; i < len; i++) {
			swap(nums, start, i);  // 一次將元素放在開始的位置
			allPerm(nums, start+1, len);  // 遞歸
			swap(nums, start, i);  // 將元素放回原樣,進行下一次遍歷
		}
	}
	/*
	 * 數組的兩個位置的元素進行交換
	 */
	public void swap(int[] nums, int i, int j) {
		int tmp = nums[i];
		nums[i] = nums[j];
		nums[j] = tmp;
	}
	/*
	 * 用整數生成數組調用全排列
	 */
	public void useAllPerm(int n) {
		int[] nums = new int[n];
		for(int i = 1; i <= n; i++) {
			nums[i-1] = i;
		}
		allPerm(nums, 0, n);
		for(int i = 0; i < result.size(); i++) {
			System.out.println(Arrays.toString(result.get(i)));
		}
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Main test = new Main();
		test.useAllPerm(4);
	}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章