zoukankan      html  css  js  c++  java
  • LeetCode | 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?

    题目:数组中只有一个例外只出现一次,其他都出现三次

    位运算实现:

    Java中位运算:与(&),或(|),非(~),异或(^)【同0异1】,左移(<<),右移(>>)
    Java中的int是用(4byte=32bit)表示的。Java中各类型字节数是由JVM决定的,与系统或平台无关
    解法:主要思想是通过32次循环,把result的32个二进制位一位一位的拼出来,为O(32N)复杂度的算法
    原理:用一个bit_count来标记数组所有项在第i二进制位为1的总位数,如果bit_count能整除3【mod 3】,说明result在这个二进制位为0,如果余1就说明result在这个二进制位为1
    通用的算法,如果不是重复3次而是K次,就用mod k来确定result的二进制位。

     

    public class Solution {
        public int singleNumber(int[] A) {
            int result = 0;                      //result初始为32位0
             
            for(int i=0; i<=32; i++){            //i=0代表32为中的倒数第一位  
                int bit_count = 0;               //bit_count表示i位为1的计数
                for(int j=0; j<A.length; j++){
                    bit_count += (A[j]>>i) & 1;  //把A[j]右移i位,再与000...0001按位与,则A[j]的i位为0结果为0,i位为1结果为1,类似累加
                }
                result |= (bit_count%3)<<i;      // bit_count%3要么为0要么为1,为1就说明result的i位为1,将其左移i位放到正确位置
            }
            return result;
        }
    }

    Map<A[i], count>实现:其时间复杂度满足要求,只是需要额外的内存

    public class Solution {
        public int singleNumber(int[] A) {
            int result = 0;
            Map<Integer,Integer> hashMap = new HashMap<Integer,Integer>();   //Map<A[i],count>
            for(int i=0; i<A.length; i++){
                if(hashMap.containsKey(A[i])){
                    hashMap.put(A[i],hashMap.get(A[i])+1);
                }else{
                    hashMap.put(A[i],1);
                }
            }
            
            Iterator<Map.Entry<Integer,Integer>> iterator = hashMap.entrySet().iterator();
            while(iterator.hasNext()){
                Map.Entry<Integer,Integer> entry = iterator.next();
                if(entry.getValue()!=3){
                    result = entry.getKey();
                    break;
                }
            }
            return result;
        }
    }





  • 相关阅读:
    (转)我是一个小线程
    Gson本地和服务器环境不同遇到的Date转换问题 Failed to parse date []: Invalid time zone indicator
    Bigdecimal 比较equals与compareTo
    springboot jpa mongodb 多条件分页查询
    springboot Consider defining a bean of type 'xxx' in your configuration
    mongodb you can't add a second
    java8 获取某天最大(23:59:59)和最小时间(00:00:00)
    java volatile详解
    SpringBoot dubbo之class is not visible from class loader
    springboot dubbo filter之依赖注入null
  • 原文地址:https://www.cnblogs.com/dosmile/p/6444462.html
Copyright © 2011-2022 走看看