實在是自己太沉,跳不動啊
時間: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);
}
}