问题描述:

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?

提示:bit manipulation(位操作)

参考:http://www.acmerblog.com/leetcode-single-number-ii-5394.html?utm_source=tuicool&utm_medium=referral

分析:由于所有数字都是出现奇数次,所以,并不是简单的异或运算。

考虑所有数字用二进制表示,如果把第i个位置上所有数字的和对3取余,那么只会有两种结果,0或1。因此,取余的结果就是那个single number。

java 代码:

一、一个直接的实现就是用大小为 32的数组来记录所有位上的和。

public int singleNumber(int[] nums){

       //所有数字都使用32位二进制表示,初始为0
int[] count = new int[32];
int result = 0; //singlenumber
for(int i = 0; i < 32; i++){
for(int j = 0; j < nums.length; j++){
int key = (nums[j] >> i) & 1;
if (key == 1) { //右移,获得第i个bit,统计1的个数
count[i] ++ ;
}
}
//第i位左移,然后将所有位相或,最终得到singlenumber
result |= ((count[i] % 3) << i);
}
return result;
}

二、使用掩码,改进算法一

  1. ones   代表第ith 位只出现一次的掩码变量
  2. twos  代表第ith 位只出现两次的掩码变量
  3. threes  代表第ith 位只出现三次的掩码变量
public int singleNumber(int[] nums){

      int ones = 0, twos = 0, threes = 0;

      for(int i = 0; i < nums.length; i++){

            twos = twos | ( ones & nums[i]);

            ones = ones ^ nums[i]; //异或3次 和 异或 1次的结果是一样的

            threes = ones & twos;  

            //对于ones 和 twos, 把出现了3次的位置设置为0 (取反之后1的位置为0)

            ones = ones & ~threes;

            twos = twos & ~threes;

      }

      return ones;

}

Single Number II leetcode java的更多相关文章

  1. Single Number III leetcode java

    问题描述: Given an array of numbers nums, in which exactly two elements appear only once and all the oth ...

  2. Ugly Number II leetcode java

    问题描述: Write a program to find the n-th ugly number. Ugly numbers are positive numbers whose prime fa ...

  3. Single Number II - LeetCode

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

  4. Leetcode 137 Single Number II 仅出现一次的数字

    原题地址https://leetcode.com/problems/single-number-ii/ 题目描述Given an array of integers, every element ap ...

  5. LeetCode 137. Single Number II(只出现一次的数字 II)

    LeetCode 137. Single Number II(只出现一次的数字 II)

  6. LeetCode(137) Single Number II

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

  7. 【LeetCode】137. Single Number II 解题报告(Python)

    [LeetCode]137. Single Number II 解题报告(Python) 标签: LeetCode 题目地址:https://leetcode.com/problems/single- ...

  8. 【leetcode】Single Number && Single Number II(ORZ 位运算)

    题目描述: Single Number Given an array of integers, every element appears twice except for one. Find tha ...

  9. 【题解】【位操作】【Leetcode】Single Number II

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

随机推荐

  1. SpringBoot 超时设置

    1.RestTemplate超时 设置配置HttpComponentsClientHttpRequestFactory中的RequestConfig属性 RestTemplateConfig: imp ...

  2. UVA11417 GCD

    题目地址 题目链接 题解 先讨论任何没有限制的情况 \[ \large { \begin{aligned} &\sum_{i=1}^{n}\sum_{j=1}^{n}gcd(i,j)\\ &a ...

  3. java 反射工具

    <dependency> <groupId>org.reflections</groupId> <artifactId>reflections</ ...

  4. Unsupervised Image-to-Image Translation Networks --- Reading Writing

    Unsupervised Image-to-Image Translation Networks --- Reading Writing 2017.03.03 Motivations: most ex ...

  5. Docker、Kubenets使用前配置

    1.开发人员需要确保机器上装有Docker并准确配置了Registry,能否推送相关镜像到Registry(运维人员无此要求) 2.能够访问Kubernetes APIServer相关API, 拥有相 ...

  6. C语言: 从 CodeBlocks 到 Microsoft Visual Studio 2017

    开学到现在寒假,学习了一个学期的C语言,同时也已然用了大半年的 CodeBlocks 来写 C/C++ 程序.CodeBlocks 是写 C/C++ 语言的程序最轻量的IDE(集成开发环境),在 C ...

  7. 每天一个小程序—第0001题(uuid模块)

    第 0001 题:  做为 Apple Store App 独立开发者,你要搞限时促销,为你的应用生成激活码(或者优惠券),使用 Python 如何生成 200 个激活码(或者优惠券)? 一开始以为是 ...

  8. .Net MVC关于子页面引用js库问题

    layout页面中的配置: @RenderSection("scripts", required: false) @RenderSection("Styles" ...

  9. 前端调用后端接口下载excel文件的几种方式

    今天有一个导出相应数据为excel表的需求.后端的接口返回一个数据流,一开始我用axios(ajax类库)调用接口,返回成功状态200,但是!但是浏览器没有自动下载excel表,当时觉得可能是ajax ...

  10. P1547 Out of Hay

    传送门     练习 只是一个最小生成树的水题,拿来练练模板 AC代码: #include<iostream> #include<cstdio> #include<alg ...