LeetCode | Single Number II
2014-11-27 21:15
363 查看
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的二进制位。
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;
}
}
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;
}
}
相关文章推荐
- LeetCode Single Number II
- leetcode-Single Number II
- LeetCode 137 Single Number II
- [leetcode] Single Number II
- leetcode——137—— Single Number II
- Leetcode-single-number-ii
- LeetCode-Single Number II
- LeetCode--Single Number II
- Leetcode Single Number II
- [Leetcode]Single Number I&II
- LeetCode:Single Number I && II
- Leetcode- Single Number II
- LeetCode--single-number-ii
- 【leetcode78】Single Number II
- Leetcode---Single Number I & II
- [leetcode][hash] Single Number II
- leetcode:Single Number II
- leetcode 137 —— Single Number II
- 104_leetcode_Single NumberII
- LeetCode136 Single Number, LeetCode137 Single Number II, LeetCode260 Single Number III