• 位运算


    Single Number :  一个整数数列,除其中一个数以外,其他数都出现2次;试找出这个数 

    要求线性复杂度,且不用什么额外空间。

    解题思路:

    寻找一种位运算[1],满足结合律、交换律,且2个相同的数做该运算会得到单位元。

    很容易想到位运算 同或,异或。以异或为例,

    0^1 = 1,

    0^0 = 0,

    1^1 = 0.

    0为单位元。满足交换律,结合律。

    所有出现两次的数做按位异或运算得到0 (00000...),单位元0再与只出现一次的数运算,得到的结果还是这个数。

    Single Number II:  一个整数数列,除其中一个数以外,其他数都出现3次;试找出这个数 

    要求线性复杂度,且不用什么额外空间。

    解题思路:

    寻找一种位运算,满足结合律、交换律,且3个相同的数做该运算会得到单位元。

    试遍了8种 (要满足交换律)从{0,1} ->{0,1} 的位运算,根本不能。有时候思路难免过于局限。

    这种运算是什么呢?  add bit by bit but mod 3.

     1 int singleNumber(int A[], int n) {
     2     
     3     int carrier = 0, sum = 0,oneBits;
     4     int i = 0;
     5     for (;i< n;i++)
     6     {
     7         carrier += sum&A[i];
     8         sum ^= A[i];
     9         
    10         oneBits = carrier&sum;
    11         
    12         carrier ^= oneBits;
    13         sum ^= oneBits;
    14     }
    15     
    16     return (carrier<<1) + sum;
    17         
    18 }

    [1]位运算:因为最后要恢复只出现一次的那个数,按位运算可以保证维度。

    题目来源:

    https://leetcode.com/problems/single-number/ 

    https://leetcode.com/problems/single-number-ii/ 

  • 相关阅读:
    [poj3974] Palindrome 解题报告 (hashmanacher)
    SQL Android
    SharedPreferences Android
    本地广播 localBroadcastManager Android
    RecyclerView Android
    自定义ListView Android
    布局 Android
    传值 Android
    活动的生命周期 Android
    CodeForces 907F Power Tower(扩展欧拉定理)
  • 原文地址:https://www.cnblogs.com/garcia-0/p/4341964.html
Copyright © 2020-2023  润新知