剑指Offer36 数组所有数字出现两次,只有两个出现了一次,找出这两个数字

Posted Juntaran

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指Offer36 数组所有数字出现两次,只有两个出现了一次,找出这两个数字相关的知识,希望对你有一定的参考价值。

 1 /*************************************************************************
 2     > File Name: 38_NumbersAppearOnce.cpp
 3     > Author: Juntaran
 4     > Mail: [email protected]
 5     > Created Time: 2016年09月03日 星期六 10时50分32秒
 6  ************************************************************************/
 7 
 8 #include <stdio.h>
 9 
10 // 判断数字二进制从右往左第index位是不是1
11 bool isBit(int num, int index)
12 {
13     num = num >> index;
14     return (num & 1);
15 }
16 
17 // 所有数字出现两次,只有两个出现了一次,找出这两个数字
18 void FindNumsAppearOnce(int* nums, int length, int* num1, int* num2)
19 {
20     if (nums==NULL || length<=2)
21         return;
22     
23     int temp = nums[0];
24     // 第一遍异或
25     for (int i = 1; i < length; ++i)
26         temp ^= nums[i];
27     
28     // 从右向左寻找temp二进制第几位是1
29     int index = 0;
30     while ((temp & 1) == 0)
31     {
32         temp = temp >> 1;
33         ++ index;
34     }
35     
36     
37     *num1 = 0;
38     *num2 = 0;
39     
40     // 分组异或
41     for (int i = 0; i < length; ++i)
42     {
43         if (isBit(nums[i], index))
44             *num1 ^= nums[i];
45         else
46             *num2 ^= nums[i];
47     }
48 }
49 
50 int main()
51 {
52     int nums[] = {2,4,3,6,3,2,5,5};
53     int length = 8;
54     int num1 = 0;
55     int num2 = 0;
56     FindNumsAppearOnce(nums, length, &num1, &num2);
57     printf("num1 is %d\nnum2 is %d\n", num1, num2);
58     return 0;
59 }

 

以上是关于剑指Offer36 数组所有数字出现两次,只有两个出现了一次,找出这两个数字的主要内容,如果未能解决你的问题,请参考以下文章

剑指offer数组中只出现一次的数字

《剑指offer》:[40]数组中只出现一次的数字

剑指Offer(Java版)第四十五题:一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。

LeetCode一个整型数组里除两个数字之外,其他数字都出现了两次,请找出这两个只出现一次的数字(剑指 Offer 56 - I. 数组中数字出现的次数) | 数组分组异或

剑指offer 40.知识迁移能力 数组中只出现一次的数字

剑指Offer对答如流系列 - 数组中数字出现的次数