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; } }