zoukankan      html  css  js  c++  java
  • 剑指Offer——数组中只出现一次的数字

    题目描述:

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


    分析:

     数组中一共有偶数个数。两个数字只出现过一次。

    相同数异或在一起等于0,那么将所有数异或最后结果就是只出现过一次的数异或在一起的结果。

    那么我们找到结果中的某一位的bit位为1,将整个数组按照该位为0和1分成两组,

    肯定可以分成两组,因为如果没有0组的话,那么数组就只可能有奇数个数;没有1组的话,那么结果不可能得到该位为1。

    两组内分别进行异或,得到两个结果,这两个结果就是只出现过一次的数。


    代码:

     1 class Solution {
     2 public:
     3     void FindNumsAppearOnce(vector<int> data, int* num1, int *num2) {
     4         int dataSize = data.size();
     5         int xorVal = 0;
     6         for(int i = 0; i < dataSize; i++) xorVal ^= data[i];    // 得到两个只出现过一次的数异或的结果
     7         int n = 1;
     8         while(xorVal) { // 找到结果中的某一bit位是1
     9             if(xorVal & 1 == 1) break;
    10             xorVal >>= 1;
    11             n <<= 1;
    12         }
    13         *num1 = *num2 = 0;
    14         // 按照刚刚找到的是1的bit位,把数分为两组,一组为1,一组为0,每组内部进行异或就可以得到两个结果,这两个结果就是那两个只出现过一次的数
    15         for(int i = 0; i < dataSize; i++) {
    16             if(data[i]&n) *num1 ^= data[i];
    17             else *num2 ^= data[i];
    18         }
    19     }
    20 };
  • 相关阅读:
    KVM克隆CentOS6虚拟机后无法启动
    Python socket网络模块
    LNMP的安装--详细版
    CentOS7 二进制安装MySQL5.6.42
    超越线程池:Java并发并没有你想的那么糟糕
    有哪些实用的计算机相关技能,可以在一天内学会?
    如何写出让hr一看就约你面试的简历
    五个最佳编程字体
    Eclipse 的 Debug 介绍与技巧
    Redis时延问题分析及应对
  • 原文地址:https://www.cnblogs.com/jacen789/p/7747697.html
Copyright © 2011-2022 走看看