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


     1 /*************************************************************************
     2     > File Name: 38_NumbersAppearOnce.cpp
     3     > Author: Juntaran
     4     > Mail: JuntaranMail@gmail.com
     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
    num2 is %d
    ", num1, num2);
    58     return 0;
    59 }
  • 相关阅读:
    mac lsof使用查看端口
    mac 安装gevent报错
    vim命令学习
    linux批量关闭进程
    坐标点转换
    screen命令记录
    hashlib模块
    PyYAML和configparser模块讲解
    xml处理模块
    json、pickleshelve模块(超级好用~!)讲解
  • 原文地址:https://www.cnblogs.com/Juntaran/p/5839717.html
Copyright © 2020-2023  润新知