面試算法篇-數組

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
遞歸,枚舉法
動態規劃問題有點難

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章