zoukankan      html  css  js  c++  java
  • LeetCode——Single Number II(找出数组中只出现一次的数2)

    问题:

    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 I 升级版,一个数组中其它数出现了3次,一个数只出现了一次,找出那个数。

    分析:

    问题I中是其它数出现了2次,一个数只出现了1次,找到出那个数,当时是使用了异或运算,轻松解决了问题。

    在问题II中题目变成了,其它数出现了3次,一个数只出现了一次,找出那个数,再简单的使用异或运算显然不能决绝这个问题,因为其它数也是出现了单数次。

    在这里,提出了一种可以解决问题的解决方案,但是不是很好,大神们用了一种更好的方法,这里在后面会贴出来,不过由于还没太理解,这里就先不做论述了,那接下来就简单的谈谈这个不是很好的方法。

    由于其它数都出现了3次,一个数只出现了一次,从bit上来考虑那就是,每个出现了3次的数在每位上都出现了3次,这里以13为例:

    1 2 3 4 5 6 7 8
    0 0 0 0 1 1 0 1

    那么3个13的话,每一位分别求和,那么一定是3的倍数,

    例如:

    位1,加了之后和为0,3的零倍;

    位5,6,8,和都为3,3的1倍。

    所以,我们可以分别求出数组中每一位所有数的和,然后对3求余就是只出现1次的数在当前位的值(0或1)。


    代码:

    public class Solution {
        public int singleNumber(int[] a) {
            int result = 0;
            for(int i=31;i>=0;i--){
                int temp = 0;
                result = result<<1;
                for(int j=0;j<a.length;j++){
                    temp += (a[j]>>i) & 1;
                }
                result |= temp%3;
            }
            return result;
        }
    }

    大神的代码:

    public class Solution {
        public int singleNumber(int[] A) {
            int ones = 0, twos = 0;
            for(int i = 0; i < A.length; i++){
            ones = (ones ^ A[i]) & ~twos;
            twos = (twos ^ A[i]) & ~ones;
            }
            return ones;
        }
    }
  • 相关阅读:
    linux下启动和关闭网卡命令及DHCP上网
    python 编码问题
    paddlepaddle
    Convolutional Neural Network Architectures for Matching Natural Language Sentences
    deep learning RNN
    Learning Structured Representation for Text Classification via Reinforcement Learning 学习笔记
    Python IO密集型任务、计算密集型任务,以及多线程、多进程
    EM 算法最好的解释
    tensorflow 调参过程
    tensorflow 学习纪录(持续更新)
  • 原文地址:https://www.cnblogs.com/chrischennx/p/4024466.html
Copyright © 2011-2022 走看看