【第22期】观点:IT 行业加班,到底有没有价值?

[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

Leetcode在线编程 single-number-ii 思维 位运算

LeetCode[位运算] - #137 Single Number II

<strong style="line-height: 1.5; background-
  • Cwind
  • Cwind
  • 2015-07-18 22:18
  • 2002

程序员升职加薪指南!还缺一个“证”!

CSDN出品,立即查看!

LeetCode-Single Number II[位运算]

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

[LeetCode]*137.Single Number II

【题目】 Given an array of integers, every element appearsthree</s

LeetCode - Single Number II

Given an array of integers, every element appears three times except for one. Find that single one. ...
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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