题干:找出数组中只出现一次的数字——一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。
#include <iostream>
#include <vector>
using namespace std;
class Solution {
public:
void FindNumsAppearOnce(vector<int> data,int* num1,int *num2) {
if (data.size()< 2) {
return;
}
int resultofxor = 0;
for (auto it = data.begin(); it != data.end(); it++) {
resultofxor ^= *it;
}
int firstindex1 = 0;
while (!(resultofxor & 1)) {
firstindex1++;
resultofxor = resultofxor >> 1;
}
*num1 = 0;
*num2 = 0;
for (auto it = data.begin(); it != data.end(); it++) {
//如果it所指元素的firstindex1位为1,则划分到num1,否则划分到num2
if (IsBit1(*it, firstindex1)) {
*num1 ^= *it;
}
else {
*num2 ^= *it;
}
}
}
bool IsBit1(int num, int index) {
return (num >> index) & 1;
}
};
int main(int argc, char const *argv[]) {
int arr[8] = {2,4,3,6,3,2,5,5};
std::vector<int> intvec(arr, arr+8);
//初始化,num1, num2, 用new申请一块内存并初始化num1 num2
int *num1 =new int;
int *num2 =new int;
Solution s;
s.FindNumsAppearOnce(intvec, num1, num2);
std::cout << *num1 << " " << *num2 << std::endl;
delete num1;
delete num2;
return 0;
}
注意指针的初始化问题。

本博客介绍了一个算法,用于在一个整型数组中找到只出现一次的两个数字,数组中的其他数字均出现两次。通过异或运算、位操作等技巧实现。
4727

被折叠的 条评论
为什么被折叠?



