題目描述:數組A包含0到n的所有整數,但其中缺了一個。在這個問題中,只用一次操作無法取得數組A裏某個整數的完整內容。此外,數組A的元素皆以二進制表示,唯一可用的訪問操作是“從A[i]中取出第j位數據”,該操作的時間複雜度爲常數。請編寫代碼找出那個缺失的整數。
代碼如下:
#include <iostream>
#include <vector>
using namespace std;
int findMissing(vector<vector<int>> &array);
int findMissing(vector<vector<int>> &input,int column);
vector<int> tenToBinary(int n);
int main()
{
vector<vector<int>> nums;
int num[] = { 0, 1, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13 };
for (int i = 0; i < 13; i++)
{
nums.push_back(tenToBinary(num[i]));
cout << 1 << ":";
for (int j = 0; j < 32;j++)
{
cout << nums[i][j];
}
cout << endl;
}
int result = findMissing(nums);
cout << "缺少的那個數爲:"<< result << endl;
return 0;
}
int findMissing(vector<vector<int>> &array)
{
return findMissing(array, 0);
}
int findMissing(vector<vector<int>> &input, int column)
{
// 結束遞歸的條件
if (input.size() == 0)
{
return 0;
}
vector<vector<int>> zeroBits;
vector<vector<int>> oneBits;
for (int i = 0; i < input.size(); i++)
{
if (input[i][31 - column] == 0)
{
zeroBits.push_back(input[i]);
}
else
{
oneBits.push_back(input[i]);
}
}
// 確定第column位爲1還是0
if (zeroBits.size() <= oneBits.size()) // 第column位爲0
{
int v =findMissing(zeroBits, column + 1);
return (v << 1) | 0;
}
else
{
int v =findMissing(oneBits, column + 1);
return (v << 1) | 1;
}
}
vector<int> tenToBinary(int n) // 將整數轉換爲二進制表示
{
vector<int> result(32, 0); // 用32位二進制存儲一個整數
/*int index = 31;
while (n != 0)
{
if ((n & 1) == 1) // 若index位爲1,則置1
{
result[index] = 1;
}
n = n >> 1;
index--;
} */
for (int index = 31; n != 0; index--, n = n >> 1)
{
if ((n & 1) == 1) // 若index位爲1,則置1
{
result[index] = 1;
}
}
return result;
}