一个非空整数数组,其他数字都出现了两次,找出那个唯一的数字????
1^3^1 = 3
1^2^1 = 2
#include <iostream>
#include <vector>
using namespace std;
/*找出数组中唯一出现的那个数字 */
void FindOnly(vector<int> &array)
{
int tmp = 0;
for(int i = 0; i < array.size(); i++)
{
tmp = tmp ^ array[i];
}
cout << tmp << endl;
}
int main()
{
int n;
cin >> n;
vector<int> array(n);
for(int i = 0; i < n; i++)
{
cin >> array[i];
}
FindOnly(array);
return 0;
}
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现了三(奇数次)次,找出那个唯一的元素?
思路:其他元素都出现了三次,按位计算每一位上1的个数,结果模3为1的那些位就是所求数二进制1所在的位。
int FindOnly(vector <int> &nums)
{
int tmp = 0;
for(int i = 0; i < 32; i++)
{
int count = 0;
for(int j = 0; j < nums.size(); j++)
{
count += (nums[j] >> i) & 1;
}
tmp |= (count%3) << i;
}
return tmp;
//cout << tmp;
}
int main()
{
int n;
cin >> n;
vector<int> nums(n);
for(int i = 0; i < n; i++)
{
cin >> nums[i];
}
int k = FindOnly(nums);
cout << k << endl;
return 0;
}
给定一个整数数组 ,其中恰好有两个元素只出现一次,其余所有元素均出现两次。 找出只出现一次的那两个元素。
void FindOnly(vector <int> &nums)
{
int tmp = 0; //记录所有异或值的总和
for(int i = 0; i < nums.size(); i++)
{
tmp = tmp^nums[i];
}
int* res = new int[2];
tmp &= -tmp; //得到异或结果最右边的1
for(int i = 0; i < nums.size(); i++)
{
if(tmp & nums[i] == 0)
res[0] ^= nums[i];
else
res[1] ^= nums[i];
}
cout << res[0] << " " << res[1] << endl;
}
int main()
{
int n;
cin >> n;
vector<int> nums(n);
for(int i = 0; i < n; i++)
{
cin >> nums[i];
}
FindOnly(nums);
return 0;
}