题目描述:一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。
问题分析:由于暴力搜索法时间复杂度太大,需要考虑用其他方法。这里用到的是异或运算的知识:异或也就是两个位相同则为0,不同则为1。若一个数与自己进行异或运算,其结果为0;若一个数与0异或,其结果为这个数本身。而如果这组数中只有一个数只出现了一次,那么所有数的异或结果就是这个数。因此对于题目给出的数组,将所有数进行异或之后的结果就等于两个只出现一次的数异或的结果。由于这两个数不相等,异或的结果必不等于0,并且其二进制数一定至少有一位为1,这里假设为第n位。
因此我们可以根据这个条件把原数组分成两个部分,每个部分只有一个只出现一次的数,划分的根据就是第n位是否为1,因为不相同的那两个数第n位必定分别是0和1。在划分完数组后,再对这两个子数组分别进行异或运算,就可以分别得到这两个只出现一次的数字了。
代码截图: