zoukankan      html  css  js  c++  java
  • 【题解】【位操作】【Leetcode】Single Number II

    Given an array of integers, every element appears three times except for one. Find that single one.

    Note:
    Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory?

    思路:

    这个题是Single Number的进阶版,如果其他的数都出现两次而不是三次,可以将所有的数进行异或,出现偶数次的bit最后会是0,而target数字中为1的bit没有被抵消而保留了下来:

    Given an array of integers, every element appears twice except for one. Find that single one.

    1 int singleNumber(int A[], int n) {
    2     int res = 0;
    3     for(int i = 0; i < n; i++){
    4         res ^= A[i];
    5     }
    6     return res;
    7 }

    Single Number的本质,就是用一个数记录每个bit出现的次数,如果一个bit出现两次就归0,这种运算采用二进制底下的位操作^是很自然的。Single Number II中,如果能定义三进制底下的某种位操作,也可以达到相同的效果,但是这个东西没有现成的可用。

    我们换个思路,Single Number II中想要记录每个bit出现的次数,一个数搞不定就加两个数,用ones来记录只出现过一次的bits,用twos来记录只出现过两次的bits,ones&twos实际上就记录了出现过三次的bits,这时候我们来模拟进行出现3次就抵消为0的操作,抹去ones和twos中都为1的bits。

     1 int singleNumber(int A[], int n) {
     2     int ones = 0;//记录只出现过1次的bits
     3     int twos = 0;//记录只出现过2次的bits
     4     int threes;
     5     for(int i = 0; i < n; i++){
     6         int t = A[i];
     7         twos |= ones&t;//要在更新ones前面更新twos
     8         ones ^= t;
     9         threes = ones&twos;//ones和twos中都为1即出现了3次
    10         ones &= ~threes;//抹去出现了3次的bits
    11         twos &= ~threes;
    12     }
    13     return ones;
    14
  • 相关阅读:
    hihocoder 1049 后序遍历
    hihocoder 1310 岛屿
    Leetcode 63. Unique Paths II
    Leetcode 62. Unique Paths
    Leetcode 70. Climbing Stairs
    poj 3544 Journey with Pigs
    Leetcode 338. Counting Bits
    Leetcode 136. Single Number
    Leetcode 342. Power of Four
    Leetcode 299. Bulls and Cows
  • 原文地址:https://www.cnblogs.com/wei-li/p/SingleNumberII.html
Copyright © 2011-2022 走看看