37.数组中只出现一次的数字

数组中只出现一次的数字
  • 参与人数:2603时间限制:1秒空间限制:32768K
  • 本题知识点:  数组
  •  算法知识视频讲解

题目描述

一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。
这道题思路想出来后就很简单了,可是我却写错了一个地方,导致调试了很久。。
// 37.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <vector>
using namespace::std;

class Solution {
public:
	void FindNumsAppearOnce(vector<int> data, int* num1, int *num2) {
		if (data.size() < 2) return;

		int divideNum = 0;
		for (int i = 0; i < data.size(); i++) {
			divideNum ^= data[i];
		}

		unsigned int bit = 0;
		while (((divideNum & 1) == 0) && (bit < 8 * sizeof(int))) {
			divideNum = divideNum >> 1;
			bit++;
		}

		*num1 = *num2 = 0;
		for (int i = 0; i < data.size(); i++) {
			if (IsBit(data[i], bit)) {
				*num1 = *num1 ^ data[i];
			}
			else {
				*num2 = *num2 ^ data[i];
			}
		}
	}
	bool IsBit(int num, int index)
	{
		num = num >> index;
		return (num & 1);
	}
	bool isZero(int num, unsigned int index) {
		num = num >> index;
		return (num & 1);
	}
};
int _tmain(int argc, _TCHAR* argv[])
{
	vector<int> test;
	test.push_back(2);
	test.push_back(4);
	test.push_back(3);
	test.push_back(6);
	test.push_back(3);
	test.push_back(2);
	test.push_back(5);
	test.push_back(5);
	Solution s;
	int num1, num2;
	s.FindNumsAppearOnce(test, &num1, &num2);
	return 0;
}

if (IsBit(data[i], bit))
我写成了
if (IsBit(*num1, bit))
吸取教训!

你可能感兴趣的:(37.数组中只出现一次的数字)