Single Number II【leetcode】
2014-09-21 23:07
323 查看
跟上一个题目很类似,只不过相同的数字出现3次,刚开始也是没有想法,想了很多关于位运算的相关的东西,可是3次始终没办法弄。
于是手欠搜了下答案。。。。。。
此题还是一个很好的题目,对于位运算的操作来说,或许能学到很多东西。
解法1:
int 为32位,统计所有32位,每个位1出现的次数,然后模3,若结果还为1,代表这个单的数这位为1,以此类推。
时间:O(32*N),这是一个通用的解法,如果把出现3次改为 k 次,那么只需模k就行了。
解法2:(还需理解)
需要一个表示相应位出现次数模3余1的变量,一个表示相应位出现次数模3余2的变量。
代码也是炫酷。
这是一个更快一些的解法,利用三个变量分别保存各个二进制位上 1 出现一次、两次、三次的分布情况,最后只需返回变量一就行了。
于是手欠搜了下答案。。。。。。
此题还是一个很好的题目,对于位运算的操作来说,或许能学到很多东西。
解法1:
int 为32位,统计所有32位,每个位1出现的次数,然后模3,若结果还为1,代表这个单的数这位为1,以此类推。
时间:O(32*N),这是一个通用的解法,如果把出现3次改为 k 次,那么只需模k就行了。
class Solution { public: int singleNumber(int A[], int n) { int bitNum[32]={0}; int res; for(int i=0;i<32;i++){ for(int j=0;j<n;j++){ bitNum[i]+=(A[j]>>i)&1; } res|=(bitNum[i]%3)<<i; } return res; } };
解法2:(还需理解)
需要一个表示相应位出现次数模3余1的变量,一个表示相应位出现次数模3余2的变量。
代码也是炫酷。
public class Solution { public int singleNumber(int[] A) { // Note: The Solution object is instantiated only once and is reused by each test case. int one = 0; int two = 0; for(int i=0; i<A.length; i++){ int tmp; tmp = ((one ^ A[i]) & (~two)); two = ((one & A[i]) | (two & (~A[i]))); one = tmp; } return one; } }另一种代码形式:(参考: http://blog.csdn.net/jiadebin890724/article/details/23306837)
这是一个更快一些的解法,利用三个变量分别保存各个二进制位上 1 出现一次、两次、三次的分布情况,最后只需返回变量一就行了。
class Solution { public: int singleNumber(int A[], int n) { int one=0, two=0, three=0; for(int i=0; i<n; i++){ two |= one&A[i]; one^=A[i]; //cout<<one<<endl; three=one&two; one&= ~three; two&= ~three; } return one; } };
相关文章推荐
- LeetCode - Refresh - Single Number II
- leetcode137 Single Number II java
- LeetCode(137) Single Number II
- LeetCode---(137)Single Number II
- [leetcode]Single Number II 详解
- [LeetCode] Single Number II
- Single Number II leetcode java
- LeetCode Single Number II
- [LeetCode]Single Number, Single Number II & Single Number III
- LeetCode:Single Number II
- 【leetcode78】Single Number II
- LeetCode | Single Number II
- Java [Leetcode 137]Single Number II
- [leetcode-137]Single Number II (c)
- 【Leetcode】 - Single Number II
- 【LeetCode-面试算法经典-Java实现】【137-Single Number II(只字出一次的数字II)】
- LeetCode Single Number II
- 《leetCode》:Single Number II
- LeetCode_Single Number II
- LeetCode--Single Number II