一個整型有序數組,數組里除了一個數字之外,其他的數字都出現了兩次。請寫程序找出這個只出現一次的數字


一、方法一

     (1)運用hashMap的方法

/*
解法2:
(1)思路:這個可以可以使用一個Map,Map對應的鍵值key就是數組中的元素,value就是這個元素出現的次數。這樣我
通過一次遍歷數組中的元素,如果元素出現在map中,則將其對應的value加1,否則將元素添加到map中,這樣遍歷一遍數組,我們就可以得到數組中每個元素對應出現的次數,然后再通過遍歷一遍map,返回value為1對應的key就是我們需要求得元素。
(2)時間復雜度:因為首先需要遍歷一遍數組,時間開銷為O(n),構建完map后需要遍歷一遍map找到value為1的元素,而map的個數為n/2,時間開銷為O(n/2),所以總的時間開銷為O(n)。
(3)空間復雜度:因為需要建立一個map,而且最后map的大小為n/2,所以空間復雜度為O(n)。
*/
    public static void findNumsAppearOnce1(int[] arr) {
        //Map對應的鍵值key就是數組中的元素,value就是這個元素出現的次數
        Map<Integer, Integer> hashMap = new HashMap<Integer, Integer>();
        for (int i : arr) {
            if (hashMap.containsKey(i)) {
                hashMap.put(i, hashMap.get(i) + 1); //如果存在,value值加1
            } else {
                hashMap.put(i, 1); //如果不存在,存入hashMap,value值等於1
            }
        }

        //遍歷一遍map,返回value為1對應的key就是我們需要求得元素
        Set<Integer> set = hashMap.keySet();
        for (int i : set) {
            if (hashMap.get(i) == 1) {
                System.out.print(i+" ");
            }
        }
    }
View Code

      (2)時間復雜度:O(n)

二、方法二

      (1)運用異或運算符的方法

public static void findNumAppearOnce(int[] arr) {
        int result = 0;
        for (int i = 0; i < arr.length; i++) {
            result ^= arr[i];
        }
        System.out.println(result);
View Code

      (2)時間復雜度:O(n)

三、方法三

     (1)二分查找法

 public static int method(int[] arr) {

        int start = 0; //定義變量,記錄最小的索引
        int end = arr.length - 1; //定義變量,記錄最大的索引
        int mid = (start + end) / 2; //定義變量,記錄中間的索引

        while ((arr[mid] == arr[mid - 1]) || (arr[mid] == arr[mid + 1])) {
            if ((arr[mid] != arr[mid - 1]) && (arr[mid] != arr[mid + 1])) {//與兩邊的數不等,break
                break;
            } else if (arr[mid] == arr[mid + 1]) {  //中間值與右邊的值相等
                if ((arr.length - 1 - mid + 1) % 2 == 0) { //加上mid對應的數后,右邊字數組的數為偶數
                    mid = 0 + (mid - 1) / 2;
                } else {
                    mid = (mid + (arr.length - 1)) / 2;
                }
            } else {   //中間值與左邊的值相等
                if ((mid + 1) % 2 == 0) { //加上mid對應的數后,左邊字數組的數為偶數
                    mid = ((mid + 1) + (arr.length - 1)) / 2;
                } else {
                    mid = (0 + mid) / 2;
                }
            }

            //判斷,到數組的兩端了,也break
            if (mid == 0 || mid == arr.length - 1) {
                break;
            }
        }
        return mid;  //如果數組中有這個元素,則返回
    }
View Code

     (2)時間復雜度:O(NlogN)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM