在以二进制格式表示的整数数组中查找缺少的元素

给定N个字符串,以二进制格式表示从0到N的所有整数,但任何一个除外。任务是找到丢失的号码。输入由字符串数组组成,其中数组元素以二进制格式表示。 例如:

null

输入: arr[]={“0000”、“0001”、“0010”、“0100”} 输出: 3. 输入: arr[]={0000”,“0001”,“0010”,“0011”,“0100”,“0110”,“0111”,“1000”} 输出 : 5

方法:

  • 在给定的N个整数中,可以观察到数字最低有效位的1和0不平衡。由于一个数字缺失,LSB中的0或1缺失。如果缺失的数字LSB=0,则计数(1)将大于等于计数(0)。如果缺失数字的LSB为1,则计数(1)小于计数(0)。
  • 从第一步可以很容易地确定缺失号码的LSB。
  • 一旦确定,丢弃所有LSB与缺失号码不同的号码,即,如果缺失号码的LSB=0,则丢弃所有LSB=1的号码,反之亦然。
  • 从第1步开始,再次重复该过程,并重复下一个LSB。
  • 继续上述过程,直到遍历所有位。

以下是上述方法的实施情况:

CPP

// C++ program to find the missing integer
// in N numbers when N bits are given
#include <bits/stdc++.h>
using namespace std;
class BitInteger {
private :
bool * bits;
public :
static const int INTEGER_SIZE = 32;
BitInteger()
{
bits = new bool [INTEGER_SIZE];
}
// Constructor to convert an integer
// variable into binary format
BitInteger( int value)
{
bits = new bool [INTEGER_SIZE];
for ( int j = 0; j < INTEGER_SIZE; j++) {
// The if statement will shift the
// original value j times.
// So that appropriate (INTEGER_SIZE - 1 -j)th
// bits will be either 0/1.
//  (INTEGER_SIZE - 1 -j)th bit for all
// j = 0 to INTEGER_SIZE-1 corresponds
// to  LSB to MSB respectively.
if (((value >> j) & 1) == 1)
bits[INTEGER_SIZE - 1 - j] = true ;
else
bits[INTEGER_SIZE - 1 - j] = false ;
}
}
// Constructor to convert a
// string into binary format.
BitInteger(string str)
{
int len = str.length();
int x = INTEGER_SIZE - len;
bits = new bool [INTEGER_SIZE];
// If len = 4. Then x = 32 - 4 = 28.
// Hence iterate from
// bit 28 to bit 32 and just
// replicate the input string.
int i = 0;
for ( int j = x; j <= INTEGER_SIZE && i < len; j++, i++) {
if (str[i] == '1' )
bits[j] = true ;
else
bits[j] = false ;
}
}
// this function fetches the kth bit
int fetch( int k)
{
if (bits[k])
return 1;
return 0;
}
// this function will set a value
// of bit indicated by k to given bitValue
void set( int k, int bitValue)
{
if (bitValue == 0)
bits[k] = false ;
else
bits[k] = true ;
}
// convert binary representation to integer
int toInt()
{
int n = 0;
for ( int i = 0; i < INTEGER_SIZE; i++) {
n = n << 1;
if (bits[i])
n = n | 1;
}
return n;
}
};
// Function to find the missing number
int findMissingFunc(list<BitInteger>& myList, int column)
{
// This means that we have processed
// the entire 32 bit binary number.
if (column < 0)
return 0;
list<BitInteger> oddIndices;
list<BitInteger> evenIndices;
for (BitInteger t : myList) {
// Initially column = LSB. So
// if LSB of the given number is 0,
// then the number is even and
// hence we add it to evenIndices list.
// else if LSB = 0 then add it to oddIndices list.
if (t.fetch(column) == 0)
evenIndices.push_back(t);
else
oddIndices.push_back(t);
}
// Step 1 and Step 2 of the algorithm.
// Here we determine the LSB bit of missing number.
if (oddIndices.size() >= evenIndices.size())
// LSB of the missing number is 0.
// Hence it is an even number.
// Step 3 and 4 of the algorithm
// (discarding all odd numbers)
return (findMissingFunc(evenIndices, column - 1)) << 1 | 0;
else
// LSB of the missing number is 1.
// Hence it is an odd number.
// Step 3 and 4 of the algorithm
// (discarding all even numbers)
return (findMissingFunc(oddIndices, column - 1)) << 1 | 1;
}
// Function to return the missing integer
int findMissing(list<BitInteger>& myList)
{
// Initial call is with given array and LSB.
return findMissingFunc(myList, BitInteger::INTEGER_SIZE - 1);
}
// Driver Code.
int main()
{
// a corresponds to the input array which
// is a list of binary numbers
list<BitInteger> a = { BitInteger("0000"), BitInteger("0001"),
BitInteger("0010"), BitInteger("0100"),
BitInteger("0101") };
int missing1 = findMissing(a);
cout << missing1 << "";
return 0;
}


输出:

3

时间复杂性: O(N)

© 版权声明
THE END
喜欢就支持一下吧
点赞14 分享