zoukankan      html  css  js  c++  java
  • LeetCode 笔记26 Single Number II

    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?

    没辙,智商碾压题。楼主没遇到之前就只会这种做法。

    public int singleNumber(int[] A) {
            Map<Integer, Integer> counters = new HashMap<>();
            for(int i = 0; i < A.length; i++) {
                if (!counters.containsKey(A[i])) {
                    counters.put(A[i], 1);
                } else {
                    counters.put(A[i], counters.get(A[i]) + 1);
                }
            }
            
            for (Integer key : counters.keySet()) {
                if (counters.get(key) == 1) {
                    return key;
                }
            }
            throw new RuntimeException("no single number");
        }

    而后我们知道可以先声明个长度32的整形数组,int[32]。第i个元素存放“这些整数第i位的1的个数除以三的余数”。好拗口是不是?

    public int singleNumber2(int[] A) {
            int[] counter = new int[32];
            int ret = 0;
            for(int i = 0; i < 32; i++) {
                for (int j = 0; j < A.length; j++) {
                    counter[i] += (A[j] >> i) & 1;
                }
                ret |= (counter[i] % 3) << i;
            }
            return ret;
        }

    看了代码其实也不是“不明觉厉”。因为assume只有一个数出现一次,其他都出现3次,那么那个single number的第i位就是余下的那个数。

    。。。

    楼主中文不好。

    btw,还有一个不是很直观的位操作方法。贴这里吧,不过没做过这个的感觉很难想到。

    http://oj.leetcode.com/discuss/857/constant-space-solution 

  • 相关阅读:
    数据库基础
    Junit单元测试、反射与注解
    Stream流
    Java IO所用类
    字符集
    Lambda表达式
    【jdk1.8源码分析】LinkedHashMap
    线性表
    【jdk1.8源码分析】ArrayList
    java学习血泪史
  • 原文地址:https://www.cnblogs.com/lichen782/p/4304406.html
Copyright © 2011-2022 走看看