题目

给出3*n + 1 个的数字,除其中一个数字之外其他每个数字均出现三次,找到这个数字。

样例

给出 [1,1,2,3,3,3,2,2,4,1] ,返回 4

挑战

一次遍历,常数级的额外空间复杂度

解题

可以利用HashMap直接解决,时间复杂度和空间复杂度都是O(N)

1.map中存在该元素则:map.put(num,map.get(num) + 1)

2.map中不存在该元素则:map.put(num , 1)

3.map中这个元素出现次数等于三次,则删除该元素

空间复杂度最坏的情况是O(N*2/3)

  1. public class Solution {
  2. /**
  3. * @param A : An integer array
  4. * @return : An integer
  5. */
  6. public int singleNumberII(int[] A) {
  7. // write your code here
  8. HashMap<Integer,Integer> map = new HashMap<Integer,Integer>();
  9. int single = 0 ;
  10. for(int i=0;i<A.length;i++){
  11. if(map.containsKey(A[i])){
  12. map.put(A[i],map.get(A[i]) + 1);
  13. }else{
  14. map.put(A[i],1);
  15. }
  16. if(map.get(A[i]) == 3){
  17. map.remove(A[i]);
  18. }
  19. }
  20. Set<Integer> keySet = map.keySet();
  21. for( Integer num:keySet){
  22. single = num;
  23. }
  24. return single;
  25.  
  26. }
  27. }

Java Code

总耗时: 2647 ms

这个方法不是很好,空间复杂度不是O(1)

上面Hashmap在put的适合都要根据key计算hashcode,再计算位置,再根据所在链表顺序更新,效率不高

在stackoverflow上,value用数组定义,或者自己定义一个引用类型变量,但是上面说的数组效率最高

  1. import java.util.*;
  2. public class Solution {
  3. /**
  4. * @param A : An integer array
  5. * @return : An integer
  6. */
  7. public int singleNumberII(int[] A) {
  8. // write your code here
  9. HashMap<Integer,int[]> map = new HashMap<Integer,int[]>(); // 数组存储效率高
  10. for(int i=0;i<A.length;i++){
  11. int[] value = map.get(A[i]);
  12. if(value==null){
  13. map.put(A[i],new int[]{1});
  14. }else{
  15. value[0]++; // 直接+1
  16. }
  17. }
  18. for(Map.Entry<Integer,int[]> entry:map.entrySet()){
  19. int[] value = entry.getValue();
  20. if(value[0]==1){
  21. return entry.getKey();
  22. }
  23. }
  24. return -1;
  25. }
  26. }

参考

当a出现一次的时候,ones能保存a。当a出现两次的时候,twos能保存a。

当a出现三次的时候,ones和twos都清零。

所以,如果一个数值中所有的数都通过这个循环的话,出现三次的数都清零了,

有一个数如果出现一次,它保存在ones中;如果出现两次的话保存在twos中。

  1. public class Solution {
  2. /**
  3. * @param A : An integer array
  4. * @return : An integer
  5. */
  6. public int singleNumberII(int[] A) {
  7. // write your code here
  8. int ones = 0;
  9. int twos = 0;
  10. for(int i=0;i< A.length ;i++){
  11. ones = (ones^A[i]) & (~ twos);
  12. twos = (twos^A[i]) & (~ ones);
  13. }
  14. return ones;
  15. }
  16. }

Java Code

总耗时: 246 ms

  1. class Solution:
  2. """
  3. @param A : An integer array
  4. @return : An integer
  5. """
  6. def singleNumberII(self, A):
  7. # write your code here
  8. ones = 0
  9. twos = 0
  10. for num in A:
  11. ones = (ones ^ num) & (~twos)
  12. twos = (twos ^ num) & (~ones)
  13. return ones

Python Code

总耗时: 258 ms

表示不理解。。。

lintcode 中等题:Singleton number II 落单的数 II的更多相关文章

  1. lintcode 中等题:Single number III 落单的数III

    题目 落单的数 III 给出2*n + 2个的数字,除其中两个数字之外其他每个数字均出现两次,找到这两个数字. 样例 给出 [1,2,2,3,4,4,5,3],返回 1和5 挑战 O(n)时间复杂度, ...

  2. 83 落单的数 II

    原题网址:http://www.lintcode.com/zh-cn/problem/single-number-ii/ 给出3*n + 1 个的数字,除其中一个数字之外其他每个数字均出现三次,找到这 ...

  3. LeetCode 136. Single Number (落单的数)

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

  4. lintcode 落单的数(位操作)

    题目1 落单的数 给出2*n + 1 个的数字,除其中一个数字之外其他每个数字均出现两次,找到这个数字. 链接:http://www.lintcode.com/zh-cn/problem/single ...

  5. 84 落单的数 III

    原题网址:http://www.lintcode.com/zh-cn/problem/single-number-iii/# 给出2*n + 2个的数字,除其中两个数字之外其他每个数字均出现两次,找到 ...

  6. LintCode笔记 - 82.落单的数

    这一题相对简单,但是代码质量可能不是很好,我分享一下我的做题笔记以及做题过程给各位欣赏,有什么不足望各位大佬指出来 原题目,各位小伙伴也可以试着做一下 . 落单的数 中文English 给出 * n ...

  7. lintcode:落单的数

    题目: 落单的数 给出2*n + 1 个的数字,除其中一个数字之外其他每个数字均出现两次,找到这个数字. 样例 给出 [1,2,2,1,3,4,3],返回 4 挑战 一次遍历,常数级的额外空间复杂度 ...

  8. LinCode落单的数

    easy 落单的数 查看执行结果 60% 通过 给出2*n + 1 个的数字,除当中一个数字之外其它每一个数字均出现两次.找到这个数字. 您在真实的面试中是否遇到过这个题? Yes 例子 给出 [1, ...

  9. [codevs3295]落单的数

    题目描述 Description 有n个数(n是奇数),其中n-1个数两两成对,有1个数落单,找出这个数.要求O(n)的时间复杂度,O(1)的空间复杂度 输入描述 Input Description ...

随机推荐

  1. C# WinForm设置TreeView选中节点

    这里假定只有两级节点,多级方法类似.遍历节点,根据选中节点文本找到要选中的节点.treeView.SelectedNode = selectNode; /// <summary> /// ...

  2. [大牛翻译系列]Hadoop(20)附录A.10 压缩格式LZOP编译安装配置

    附录A.10 LZOP LZOP是一种压缩解码器,在MapReduce中可以支持可分块的压缩.第5章中有一节介绍了如何应用LZOP.在这一节中,将介绍如何编译LZOP,在集群做相应配置. A.10.1 ...

  3. 51nod 1021 石头归并

    1021 石子归并 基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题  收藏  关注 N堆石子摆成一条线.现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆石子合 ...

  4. jquery数组之存放checkbox全选值示例代码

    使用jquery数组可以存放checkbox全选值,下面有个不错的示例,感兴趣的朋友可以参考下. 复制代码代码如下: <input type="checkbox" id=&q ...

  5. jquery中简易tab切换

    <!doctype html> <html> <head> <title>test</title> <meta content=&qu ...

  6. Linux下C程序插入执行shell脚本

    1.system(执行shell命令) 相关函数 fork,execve,waitpid,popen表头文件 #include<stdlib.h>定义函数 int system(const ...

  7. java之jar命令详解

    1. JAR 文件包 JAR 文件就是 Java Archive File,顾名思意,它的应用是与 Java 息息相关的,是 Java 的一种文档格式.JAR 文件非常类似 ZIP 文件——准确的说, ...

  8. MySQL 从库日志比主库多

    在群里聊天的时候,一个群友说,生产库主库宕机,但是主从数据库数据一致,但是从库的日志比主库多,很是不理解! 咨询后发现,生产库的主库没有设置sync_binlog=1,而是为sync_binlog=0 ...

  9. CPU原理

    cpu map 1.CPU的整体架构: 2.从CPU向内存 3.CPU和内存的关系图 4.CPU指令集 5.A+B 6.结果输入寄存器 7.寄存器中的临时存储,用来暂存B 8.将B传入寄存器 9.A会 ...

  10. iOS开发网络篇—大文件的多线程断点下载(转)

    http://www.cnblogs.com/wendingding/p/3947550.html   iOS开发网络篇—多线程断点下载 说明:本文介绍多线程断点下载.项目中使用了苹果自带的类,实现了 ...