题目

给出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)

public class Solution {
/**
* @param A : An integer array
* @return : An integer
*/
public int singleNumberII(int[] A) {
// write your code here
HashMap<Integer,Integer> map = new HashMap<Integer,Integer>();
int single = 0 ;
for(int i=0;i<A.length;i++){
if(map.containsKey(A[i])){
map.put(A[i],map.get(A[i]) + 1);
}else{
map.put(A[i],1);
}
if(map.get(A[i]) == 3){
map.remove(A[i]);
}
}
Set<Integer> keySet = map.keySet();
for( Integer num:keySet){
single = num;
}
return single; }
}

Java Code

总耗时: 2647 ms

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

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

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

import java.util.*;
public class Solution {
/**
* @param A : An integer array
* @return : An integer
*/
public int singleNumberII(int[] A) {
// write your code here
HashMap<Integer,int[]> map = new HashMap<Integer,int[]>(); // 数组存储效率高
for(int i=0;i<A.length;i++){
int[] value = map.get(A[i]);
if(value==null){
map.put(A[i],new int[]{1});
}else{
value[0]++; // 直接+1
}
}
for(Map.Entry<Integer,int[]> entry:map.entrySet()){
int[] value = entry.getValue();
if(value[0]==1){
return entry.getKey();
}
}
return -1;
}
}

参考

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

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

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

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

public class Solution {
/**
* @param A : An integer array
* @return : An integer
*/
public int singleNumberII(int[] A) {
// write your code here
int ones = 0;
int twos = 0;
for(int i=0;i< A.length ;i++){
ones = (ones^A[i]) & (~ twos);
twos = (twos^A[i]) & (~ ones);
}
return ones;
}
}

Java Code

总耗时: 246 ms

class Solution:
"""
@param A : An integer array
@return : An integer
"""
def singleNumberII(self, A):
# write your code here
ones = 0
twos = 0
for num in A:
ones = (ones ^ num) & (~twos)
twos = (twos ^ num) & (~ones)
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. WinForm TreeView节点重绘,失去焦点的高亮显示

    当用户焦点离开TreeView时,TreeView选中节点仍然高亮,但是颜色符合主题. 设置TreeView.HideSelection = False;可让选中节点保持高亮. 添加重绘事件 Tree ...

  2. How to generate number Sequence[AX 2012]

    Suppose we want create number sequence for Test field on form in General  ledger module Consideratio ...

  3. intellij idea 代码正常,但是编译出现 java:需要";"

    1. 查看idea 的maven 插件是不是版本太低,发现应用里是用的jdk是1.7 maven插件是2.2.1 2. 查看应用编码,比如部分文件是GBK,里面有中文,而整个应用的编码是Utf-8

  4. Activity的Launch mode详解 singleTask正解

    Activity有四种加载模式:standard(默认), singleTop, singleTask和 singleInstance.以下逐一举例说明他们的区别: standard:Activity ...

  5. oracle建用户

    create user ng_zj identified by ng_zjdefault tablespace tbs_testtemporary tablespace tbs_test_tmp; g ...

  6. 我应该直接学Swift还是Objective-C?

    当我们发布了Swift语言学习课程之后,收到了很多邮件和私信来问自己是否还需要学习C或者Objective-C.此外,人们似乎还在迷惑Swift到底适合iOS开发生态中的哪些部分.通过这篇文章,我希望 ...

  7. How to install DIG dns tool on windows 7

    This guide explain how to install dig dns tool on windows 7 in few steps: 1. First go to http://www. ...

  8. ASP.NET MVC +EasyUI 权限设计(四)角色动作

    请注明转载地址:http://www.cnblogs.com/arhat 由于最近的事情比较多,一直忙于工作和照顾老婆,所以老魏更新的速度慢了,本来写文章就要占据工作和生活很多的时间,这也就是院子中很 ...

  9. SAP如何使用关于序列号的表

  10. mysql 的存储过程调试软件

    免费下载链接:http://download.csdn.net/detail/meiyoudao/6371137  需要注册 调试还是 F10 类似的