算法__尋找缺失的整數

題目一:一個無序數組裏有99個不重複的正整數,範圍1到100,唯獨缺少一位整數,找出這個整數。

解:求出1到100的所有數的和減去數組中數的和就是缺失的數

public int thisNumber(int[] a) {
    int s = 100 * 101 >> 1;
    int size = a.length;
    for (int i = 0; i < size; i++) {
        s -= a[i];
    }
    return s;
}

拓展一:一個無序數組有若干個整數,範圍從1到100,其中99個整數都出現了偶數次,只有一個整數出現了一個奇數次,找出這個奇數。

解:異或整個數組,得到的就是該奇數。

      補充: & :  1&1=1,1&0=0,0&0=0;(都是1是1,不然都是0)

                  | : 1|1=1,1|0=1,0|0=0;(只要有1就是1)

                 ~ :  ~1=0,~0=1;

                 ^  :   1^1=0,1^0=1,0^0=0;(相同爲 0,不同爲1)

 public int getOdd(int[] a) {
        int size = a.length,sum=0;
        for (int i = 0; i < size; i++) {
            sum^=a[i];
        }
        return sum;
    }

拓展二:一個無序數組裏有若干個正整數,範圍從1到100,其中98個整數都出現了偶數次,只有兩個整數出現了奇數次,找出這兩個奇數。

解:異或整個數組,得到的值即爲整兩個奇數次。得到的值,中有一位10010,即這倒數第二位的1,一定是一個爲1,一個爲0。用這一位異或一遍數組,分別取出等於0和不等於0的兩個數字即爲兩個奇數。

 public int[] getTodd(int[] a) {
        int sum = getOdd(a);

        int req = 1;
        while ((sum & req) != 1) {
            req <<= 1;
        }

        int result[] = new int[2], size = a.length;

        for (int i = 0; i < size; i++) {
            if ((req & a[i]) == 1) {
                result[0] ^= a[i];
            } else {
                result[1] ^= a[i];
            }
        }
        return result;
    }

 

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