1.从0到n-1中缺了一个数,找出这个数。
方案:(1)先排序再找;(2)位图的方案;(3)0到n-1的和已经知道了,则求出目前这个n-1个数的和,两者相减就能求出来; (4)沿用第三种方案,但是不用加,而用异或。
下面为方案4的代码:
#include <iostream>
#include <exception>
using namespace std;
int FindMissNumber(const int arr[],int len)
{
if(!arr || len<=0)
throw new exception("NULL Array");
int ret = 0;
int temp = 0;
for(int i=0; i<len; ++i){
ret ^= arr[i];
temp ^= i;
}
temp ^= len; //缺一个数,则最大数为len
ret ^= temp;
return ret;
}
int main()
{
const int SIZE = 5;//从0到5
const int arr[SIZE] = {1,2,3,4,5};
cout<<"Miss "<<FindMissNumber(arr,SIZE)<<endl;
system("pause");
return 0;
}
2.从0到n-1中缺了两个数,找出这两个数。(这道题类似有一堆数,里面2个数出现奇数次,其他都出现偶数次,找出这两个数)
方案:(1)可以采用位图方案;(2)异或方案。
下面贴出方案2的代码:
#include <iostream>
#include <exception>
using namespace std;
typedef pair<int,int> Result;
int FindOneInNum(int Num) //寻找一个数中最低为1的一位
{
int ret = 1;
while(!(Num & ret)){
ret <<= 1;
}
return ret;
}
Result FindMissNumber(const int arr[],int len)
{
if(!arr || len<=0)
throw new exception("NULL Array");
int xorResult = 0;
int i = 0;
for(i=0; i<len; ++i){
xorResult ^= arr[i];
xorResult ^= i;
}
xorResult ^= len;
xorResult ^= (len + 1);
int oneBit = FindOneInNum(xorResult);
int misNum1 = 0;
int misNum2 = 0;
for(i=0; i<len; ++i){
if(arr[i] & oneBit)
misNum1 ^= arr[i];
else
misNum2 ^= arr[i];
if(i & oneBit)
misNum1 ^= i;
else
misNum2 ^= i;
}
if(len & oneBit)
misNum1 ^= len;
else
misNum2 ^= len;
if((len+1) & oneBit) //缺2个数,则最大数应该为len+1
misNum1 ^= (len + 1);
else
misNum2 ^= (len + 1);
return make_pair(misNum1,misNum2);
}
int main()
{
const int SIZE = 4;//从0到5
const int arr[SIZE] = {1,2,4,5};
Result ret = FindMissNumber(arr,SIZE);
cout<<"Miss "<<ret.first<<" and "<<ret.second<<endl;
system("pause");
return 0;
}
PS:很久没写代码了,手生了。come on!