[LeetCode],Single Number II

原创 2013年12月03日 20:27:36

前言

最近感觉学习一门语言和学习算法不同,语言一定要学以致用,之前Java 集合看过好几遍了,今天用来写ACM的时候,连HashMap怎么遍历都得现google,唉,感觉自己这学习能力低到一定程度了

题目

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


思路

分析:给定一个数组,除了一个元素之外其它元素都出现了三次,找出这个元素(这道题的测试用例中这个元素只出现了1次)

HashMap

我想大多数同学碰到这个问题都会首先考虑用HashMap,key为当前元素,value为元素出现的个数,然后遍历HashMap,找出出现次数不为3的元素即可

时间复杂度为O(n),空间复杂度为O(n)

/**
 * 使用HashMap解决singleNumberII问题
 * 
 * @param A
 * @return
 */
public static int singleNumberI(int[] A) {
    Map<Integer, Integer> hm = new HashMap<Integer, Integer>();
    int i, target = A[0];

    for (i = 0; i < A.length; i++) {
        if (hm.containsKey(A[i])) {
            hm.put(A[i], hm.get(A[i]) + 1);
        } else {
            hm.put(A[i], 1);
        }
    }

    Iterator<Map.Entry<Integer, Integer>> itor = hm.entrySet().iterator();

    while (itor.hasNext()) {
        Map.Entry<Integer, Integer> entry = itor.next();
        if (entry.getValue() != 3) {
            target = entry.getKey();
            break;
        }
    }

    return target;
}


位运算

java里int始终占4个字节,32位,我们外层循环遍历32次,然后内层循环记录0-31位每一位出现的次数,内层循环结束后将结果取余于3即为当前位的值

时间复杂度O(32 * n), 空间复杂度O(1)

/**
 * 利用位运算和取余实现
 * 
 * @param A
 * @return
 */
public static int singleNumberII(int[] A) {
    int i, j, bit, result = 0;

    for (i = 0; i < 32; i++) {
        for (j = bit = 0; j < A.length; j++) {
            if (((A[j] >> i) & 1) == 1) {
                bit++;
            }
        }

        bit = bit % 3;

        result |= bit << i;
    }

    return result;
}






版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

[leetcode] Single Number II

转自:http://www.tuicool.com/articles/UjQV7n 题目描述: 给定一个包含n个整数的数组,除了一个数出现一次外所有的整数均出现三次,找出这个只出现一次...

[题解][LeetCode][Single Number II]

题目: 题解: Code: class Solution: # @param A, a list of integer ...

LeetCode(137) Single Number II

题目Given an array of integers, every element appears three times except for one. Find that single one...
  • fly_yr
  • fly_yr
  • 2015年10月22日 13:19
  • 290

【leetcode78】Single Number II

题目描述:给定一个数组,里面除了一个数字,其他的都出现三次。求出这个数字原文描述:Given an array of integers, every element appears three tim...

【LeetCode】137. Single Number II

137. Single Number II Given an array of integers, every element appears three times except for one...

[leetcode] Single Number II

Single Number II  Total Accepted: 13814 Total Submissions: 42303My Submissions Given an ...

[Leetcode]Single Number II

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

leetcode:Single Number II

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

leetcode Single Number II

http://www.cnblogs.com/daijinqiao/p/3352893.html PS:对于这种作者,孤只想默默点个赞 题目描述:给定一个包含n个整数的数组,除了一个数出现...
  • youqika
  • youqika
  • 2013年11月26日 10:52
  • 479

Leetcode Single Number II

转载自:http://www.cnblogs.com/daijinqiao/p/3352893.html 对于除出现一次之外的所有的整数,其二进制表示中每一位1出现的次数是3的整数倍,将所有这些1清...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[LeetCode],Single Number II
举报原因:
原因补充:

(最多只允许输入30个字)