标签:
Given 3*n + 1
numbers, every numbers occurs triple times except one, find it.
Example
Given [1,1,2,3,3,3,2,2,4,1]
return 4
One-pass, constant extra space.
这道题考的是位运算,我对位运算的应用还没有掌握,
先用arrays.sort排序, 然后直接寻找做了一遍,超时了。显然不符合题意解法。
然后用hashmap做了一遍。hashmap做的时候注意遍历hashmap时提取到的key是object,需要先把其转换成string类型,然后转换成int类型。这次通过了。
public class Solution { /** * @param A : An integer array * @return : An integer */ public int singleNumberII(int[] A) { // write your code here if(A.length==0) { return 0; } int n=A.length; int count=0; int res=0; HashMap<Integer,Integer> map=new HashMap<Integer,Integer>(); for(int i=0;i<n;i++) { if(map.containsKey(A[i])) { map.put(A[i],count++); } else { map.put(A[i],1); } } Iterator j=map.keySet().iterator(); while(j.hasNext()) { int key=Integer.parseInt(String.valueOf(j.next())); int value=map.get(key); if(value==1) { res=key; break; } } return res; } }
用位运算处理(&与,|或,<<左移 >> 右移)
public class Solution { /** * @param A : An integer array * @return : An integer */ public int singleNumberII(int[] A) { // write your code here if(A.length==0) { return 0; } int n=A.length; int res=0; for(int i=0;i<32;i++) { int count=0;
//每循环一次,mask左移一位。
int mask=1<<i; for(int j=0;j<n;j++) {
int val=A[j]&mask;// 计算数列中每个数的第i位与1 与运算的结果
if(val!=0) { count++;//计算1的个数 } } if(count%3!=0) //如果数列中i位置的1的个数不是3的倍数 { res=res|mask;//则保留第i位的1 } } return res; } }
标签:
原文地址:http://www.cnblogs.com/kittyamin/p/5129037.html