您的位置:首页 > 职场人生

百度两道面试题

2014-01-08 21:36 435 查看
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!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  百度 面试