剑指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(Java版)第四十五题:一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。
LeetCode一个整型数组里除两个数字之外,其他数字都出现了两次,请找出这两个只出现一次的数字(剑指 Offer 56 - I. 数组中数字出现的次数) | 数组分组异或