题目描述:数组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;
}