題目一:一個無序數組裏有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;
}