Leetcode: Single Number

Given an array of integers, every element appears twice except for one. Find that single one.



Note:

Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory?

Analysis: 需求里面要求O(N)时间以及无额外空间,这就排除了使用boolean array, hashmap这些个方法,只能在原数组上进行查找。O(N)基本上就相当于遍历数组.

第二遍做法: 17行 & 运算符优先等级低于 == 所以一定要打括号

 1 public class Solution {

 2     public int singleNumber(int[] A) {

 3         int[] check = new int[32];

 4         int res = 0;

 5         for (int i=0; i<A.length; i++) {

 6             for (int j=0; j<32; j++) {

 7                 if ((A[i]>>j & 1) == 1) {

 8                     check[j]++;

 9                 }

10             }

11         }

12         for (int k=0; k<32; k++) {

13             if (check[k] % 2 == 1) {

14                 res |= 1<<k;

15             }

16         }

17         return res;

18     }

19 }

 与Single Number II类似,只不过把取余3改成取余2

 1 public int singleNumber(int[] A) {

 2     int[] digits = new int[32];

 3     for(int i=0;i<32;i++)

 4     {

 5         for(int j=0;j<A.length;j++)

 6         {

 7             digits[i] += (A[j]>>i)&1;

 8         }

 9     }

10     int res = 0;

11     for(int i=0;i<32;i++)

12     {

13         res += (digits[i]%2)<<i;

14     }

15     return res;

16 }

 另外注意位运算符的优先级等级:

1
() [] .
从左到右
2
! +(正)  -(负) ~ ++ --
从右向左
3
* / %
从左向右
4
+(加) -(减)
从左向右
5
<< >> >>>
从左向右
6
< <= > >= instanceof
从左向右
7
==   !=
从左向右
8
&(按位与)
从左向右
9
^
从左向右
10
|
从左向右
11
&&
从左向右
12
||
从左向右
13
?:
从右向左
14
= += -= *= /= %= &= |= ^=  ~=  <<= >>=   >>>=
从右向左

你可能感兴趣的:(LeetCode)