【剑指 Offer 题解】56. 数组中只出现一次的数字

题目

一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。

思考

  • 异或操作,二进制数的每位进行异或,相同为0,不同为1.
  • 两个相同的数进行异或,结果为0。
  • 如果题目 改为 “只有一个数只出现过一次,其他的都出现了2次”,全部数字异或运算,最终的结果就是只出现一次的数字,解题如下
public int findNum(int nums[]) {
	int result = 0;
	for (int num : nums) {
		result = result ^ num;
	}
	return result;
}
  • 本题中有两只出现过1次的数字,那么所有数字异或的结果即为那两个单一数字异或的结果。
  • 接下来要做的是,把数组划分成两组A、B,两个出现一次的数字分在不同的组里,相同的数字分在同一个组了,这样就把问题转换成上面的形式了
  • 两个不同的数异或,不同的位,值为1,利用这个特点就划分两个组了。
  • result = result & -result得到出 result 最右侧不为 0 的位
//num1,num2分别为长度为1的数组。传出参数
//将num1[0],num2[0]设置为返回结果
public void FindNumsAppearOnce(int [] array,int num1[] , int num2[]) {
    int result = 0;
    for (int num : array) {
        result = result ^ num;
    }
    result = result & -result;
    for (int num : array) {
        if ((num & result) == 0) {
            num1[0] = num1[0] ^ num;
        } else {
            num2[0] = num2[0] ^ num;
        }
    }
}
发布了18 篇原创文章 · 获赞 0 · 访问量 500

猜你喜欢

转载自blog.csdn.net/qingqingxiangyang/article/details/104417331
今日推荐