百度两道面试题

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!


  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值