數組A包含0到n的所有整數,但其中缺了一個,且數組A裏的整數都是用二進制形式存儲,求這個缺失的整數

題目描述:數組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;

}


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