WEB开发网
开发学院软件开发C++ 寻找出现奇数次的数 阅读

寻找出现奇数次的数

 2012-05-21 17:20:04 来源:WEB开发网   
核心提示: 1. n个数,其中有且仅有一个数出现了奇数次,寻找出现奇数次的数,其余的数都出现了偶数次,用线性时间常数空间找出出现了奇数次的那一个数,其中有且仅有两个数出现了奇数次,其余的数都出现了偶数次, 2. n个数,其中有且仅有两个数出现了奇数次

 1. n个数,其中有且仅有一个数出现了奇数次,其余的数都出现了偶数次。用线性时间常数空间找出出现了奇数次的那一个数。
2. n个数,其中有且仅有两个数出现了奇数次,其余的数都出现了偶数次。用线性时间常数空间找出出现了奇数次的那两个数。
解题思路
1. 全部异或
2. 全部异或得到A,根据A的任意值为1的位将所有数分成两组,位上为1的异或得到a,剩下的组异或得到b。

以下是问题2的代码

FindOddNum.cpp

/*
功能:n个数,其中有且仅有两个数出现了奇数次,其余的数都出现了偶数次。
      用线性时间常数空间找出出现了奇数次的那两个数。
written by baoer on 2012-5-21
*/

#include <iostream>
#include <vector>
using namespace std;

//find 2 number which appear odd times
void FindOddNumber(const vector<int> &num)
{
	int sum = 0;
	for(int i=0; i<num.size(); i++)  //所有数求异或
	{
		sum ^= num[i];
	}
	
	if(sum == 0)
	{
		cout << "no such number" << endl;	
	}
	else
	{
		int count = 0;
		int temp = sum;
		while(!(temp&1))  //得到最低一位1所在的位置
		{
			temp >>= 1;
			count++;
		}

		int a = 0;   //第一个数
		for(int i=0; i<num.size(); i++)
		{
			if((num[i]>>count)&1)    //根据第count位的值进行分组
			{
				a ^= num[i];
			}
		}
		int b = sum ^ a;   //第二个数
		cout << "a = " << a << endl;
		cout << "b = " << b << endl;
	}
}

int main(void)
{
	int n;
	vector<int> num;

	cout << "input n: ";
	cin >> n;

	cout << "input " << n << " numbers, seperated by space" << endl;
	int v;
	for(int i=0; i<n; i++)
	{
		cin >> v;
		num.push_back(v);	
	}

	FindOddNumber(num);

	return 0;
}

Tags:寻找 出现 数次

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接