解法1:
比较慢。
/**
* Definition of BitInteger:
* class BitInteger {
* public:
* static int INTEGER_SIZE;
* int fetch(int j) {
* .... // return 0 or 1, fetch the jth bit of this number
* }
* }
* int BitInteger::INTEGER_SIZE = 31;
*/
class Solution {
public:
/**
* @param str a BitInteger list
* @return an integer
*/
int findMissing(vector<BitInteger>& array) {
int arraySize = array.size();
int result = 0;
for (int i = 0; i < BitInteger::INTEGER_SIZE; ++i) {
for (auto bitInt : array) {
result ^= (bitInt.fetch(i)) << i;
}
for (int j = 0; j < arraySize + 1; ++j) {
result ^= j & (1 << i);
}
}
return result;
}
};
解法2:
在九章看到这个很牛的解法,相关解释如下。下次再分析。
基本思路:
1:将数组中的每个数字转换成二进制。
2:如果这些数是连续的。针对每一个二进制的每一位(从右往左),0的个数一定大于等于1的个数。你可以尝试写一些二进制数观察一下,很容易可以得知。
3:判断0和1的个数.如果相等,那么奇数的个数和偶数相等,缺失的就是0这个数字。如果当前位置的1>0,那么缺失的就是当前位置二进制表示为0的数,然后在此基础上找下一位。小于的情况同理。
public class Solution {
/**
* @param array a BitInteger list
* @return an integer
*/
public int findMissing(ArrayList<BitInteger> array) {
// Write your code here
/* Start from the least significant bit, and work our way up */
return findMissing(array, 0);
}
public int findMissing(ArrayList<BitInteger> input, int column) {
if (column >= BitInteger.INTEGER_SIZE) { // We're done!
return 0;
}
ArrayList<BitInteger> oneBits = new ArrayList<BitInteger>();
ArrayList<BitInteger> zeroBits = new ArrayList<BitInteger>();
for (BitInteger t : input) {
if (t.fetch(column) == 0) {
zeroBits.add(t);
} else {
oneBits.add(t);
}
}
if (zeroBits.size() <= oneBits.size()) {
int v = findMissing(zeroBits, column + 1);
return (v << 1) | 0;
} else {
int v = findMissing(oneBits, column + 1);
return (v << 1) | 1;
}
}
}