数组中只出现一次的数字
2016-03-21 17:50
239 查看
题目描述
一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。数组中有两个数字只出现一次,但是其它数字都出现两次,这让我们想到了,整个数组中只有一个数字只出现一次,其它数字都出现两次的题目。如果是这样子的话,利用异或的性质--相同为0,相异为1,把所有数字进行异或就可以得到只出现一次的那个数字了。但是这个题目里面有两个只出现一次的数字,如果能够把它们分成两组,把这个题目转化成两个刚才那个题目就很简单了。
有两个不同的数字,那么对这个数组中所有的数据进行异或肯定不为0,那我们可以找到不为0的那一位flag,把整个数组分开,所有flag位为1的为一组A,flag为0的为一组B,在相同的数字肯定在同一个组里面,A,B组就转换成那个子问题了,即数组中只有一个数字只出现一次。
class Solution { public: void FindNumsAppearOnce(vector<int> data,int* num1,int *num2) { int length = data.size(); if(length <2) return ; int result = 0; for(int i = 0; i < length; i ++){ result ^= data[i]; } unsigned int indexOf1 = FindFirstBitIs1(result); *num1 = *num2 = 0; for(int i = 0; i < length; i ++){ if(IsBit1(data[i], indexOf1)) *num1 ^= data[i]; else *num2 ^= data[i]; } } unsigned int FindFirstBitIs1(int num){ int indexBit1 = 0; while((num & 1) == 0 && (indexBit1 < 8 *sizeof(int))){ num = num >> 1; ++ indexBit1; } return indexBit1; } bool IsBit1(int num, unsigned int indexBit1){ return (num >> indexBit1) & 1; } };
相关文章推荐
- JavaScript中按位“异或”运算符使用介绍
- Java中使用异或运算符实现加密字符串
- 异或的性质及运用
- 【位运算】之 异或
- 面试题3:二维数组中的查找
- 面试题四:替换空格
- 剑指offer第一题
- 巧用异或运算
- 剑指Offer 面试题3:二维数组中查找
- 求两个字符串的最长的连续公共子串(按位异或法)
- 二叉树两个结点的最低公共祖先
- 根据后序和中序遍历重建二叉树
- 根据先序和中序遍历重建二叉树
- 根据先序和中序遍历重建二叉树
- 根据后序和中序遍历重建二叉树
- 二叉树两个结点的最低公共祖先
- 《剑指Offer》面试题1:赋值运算符函数
- 剑指offer第三题:二维数组中查找
- 位“异或”运算在变量交换中的应用及与位“或”的逻辑关系
- 在一个数组中查找两个重复出现两次的数