寻找出现奇数次的数
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; }
更多精彩
赞助商链接