0.各種基礎排序(快排*,歸併*,選擇,希爾等)
1.給定一個 1-100 的整數數組,請找到其中缺少的數字。
思路1:
只缺少一個數,其不重複的情況下可以求和,已知1-100的和是5050,對應的數組求和sum,用5050-sum=result,這個result就是缺少的數字,
思路2
創建一個array length=100,index和實際值對號入座,遍歷對應index爲空的,就是缺少的數字.
思路3
利用位運算的異或運算⊕
a ^ a = 0
a ^ b ^ b = a
成對數字異或運算等於0;
2.請在給出的整數數組中找到重複的數字。
思路1
使用hashMap,key是數字,value是count,連續遍歷兩次
public void find(int[] arr){
if(arr.length > 0){
Map<Integer,Integer> map = new HashMap<Integer,Integer>();
for(int i=0;i<arr.length;i++){
if(null == map.get(arr[i])){
map.put(arr[i],1);
}else{
Integer count = map.get(arr[i]);
map.remove(arr[i]);
map.put(arr[i],count+1);
}
}
for(Integer key:map.values){
if(map.get(key)>1){
system.out.print("result:"+value);
}
}
}
}
思路2
先排序,這讓重複的數字肯定相鄰,比較兩個相鄰的數字是否相等,找到這個數字.
public void find(int[] arr){
if(arr.length > 0){
Arrays.sort(arr);
for(int i=0;i<arr.length-1;i++){
int n = i+1;
if(arr[i] == arr[n]){
system.out.print("result:"+arr[i]);
}
}
}
}
3.在未排序的整數數組中找到最大值與最小值
思路1
定義兩個數字min,max,一次遍歷:
arr[i]>max,則 max = arr[i]
arr[i]<min,則 min = arr[i]
4.請找出一個有序數組中兩個元素的和等於給定數字
思路1
用hashMap 時間複雜度O(n)
思路2
從左到右遍歷數組,在遍歷的過程中,取一個元素 a,然後讓 sum 減去 a,這樣可以得到 b,即 b = sum - a。然後由於數組是有序的,我們再利用二分查找,在數組中查詢 b 的下標。
時間複雜度O(nlgN)
思路3
雙指針 O(n)
public int[] find(int[] arr,int tager){
int start = 0;
int end = arr.length-1;
while(end > start){
if(arr[start]+arr[end] > tager){
end--;
}else if(arr[start]+arr[end] < tager){
start++;
}else{
int[] result = new int[2];
result[0] = arr[start];
result[1] = arr[end];
return result;
}
}
}
5.如何刪除現有數組中的重複項
思路1
使用Set的特性
思路2
創建一個新數組,將原來的元素一個個添加進去,添加前判斷是否重複,
時間複雜度O(n平方),而且還需要額外增加空間.
思路3
使用HashMap,遍歷一次將所有元素放入map,放入前先get,get不到則放入.
哈希算法時間複雜度O(1),整體時間複雜度O(2n+1) = O(n),需要使用額外空間.
6.數組旋轉 *(高頻)
思路1
1.獲取最高位的數字
2.把其他位上的數字都擡高一位
3.把最初獲得最高位的數字賦值到最低位置上
public void rotate(int[] arr,int k){
int lenght = arr.lenght;
if(lenght < 1){
return;
}
k = k % lenght;
int i = 0;
while(k > i){
i++;
int last = arr[lenght - 1];
for(int n= lenght-1;n>0;n--){
arr[n-1] = arr[n];
}
arr[0] = last;
}
}
思路2
創建一個新數組,將旋轉結果放入新數組中
public int[] rotate(int[] arr,int k){
int lenght = arr.length;
if(length < 1){
return arr;
}
int[] result = new int[lenght];
k= k % lenght;
for(int n = 0; n < lenght ; n++){
if(n+k > lenght-1){
result[n] = arr[(n+k)-lenght];
}else{
result[n] = arr[n+k];
}
}
return result;
}
7.請找出數組中所有總和等於給定數字的組合
思路1
遞歸,枚舉法
動態規劃問題有點難