Leetcode Single Number II (面试题推荐)
2014-07-31 15:19
363 查看
还记得《剑指offer》和《编程之美》等书上多次出现的找一个数组中只出现一次的数那个题吗?
leetcode也有这道题 链接here 相信大家都知道用异或在O(n)的时间复杂度内求出的方法,这里不再赘述。
下面就是上题的升级版
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?
给你一个整数数组,每个元素出现了三次,但只有一个元素出现了一次,让你找出这个数,要求线性的时间复杂度,不使用额外空间。
这样就不能使用异或的方法了,把所有元素以后得到的就是所有元素的异或值了,对我们没有任何帮助。
这个问题依旧使用位运算来解决,不过更加复杂。
我们用三个变量one two three,分别存储二进制未分别出现一次 两次 三次的位。
leetcode也有这道题 链接here 相信大家都知道用异或在O(n)的时间复杂度内求出的方法,这里不再赘述。
下面就是上题的升级版
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?
给你一个整数数组,每个元素出现了三次,但只有一个元素出现了一次,让你找出这个数,要求线性的时间复杂度,不使用额外空间。
这样就不能使用异或的方法了,把所有元素以后得到的就是所有元素的异或值了,对我们没有任何帮助。
这个问题依旧使用位运算来解决,不过更加复杂。
我们用三个变量one two three,分别存储二进制未分别出现一次 两次 三次的位。
class Solution { public: int singleNumber(int A[], int n) { int one = 0, two = 0, three = 0; for(int i = 0; i < n; i++) { three = two & A[i]; //出现三次的位肯定是由出现两次的得到的 two = two | ones & A[i]; //出现两次的肯定是出现一次的得到的,不过还有原有的所以要或 one = one | A[i]; //计算出现一次的位 two = two & ~three; //去掉二进制中出现三次的位 ones = one & ~three; //去掉二进制中出现三次的位</span> } return one; //最终twos three都为0,one就是我们要的答案 } };
相关文章推荐
- Leetcode Single Number II (面试题推荐)
- Leetcode: Single Number II
- LeetCode_Single Number II
- leetcode 之 Single Number II
- [LeetCode] Single Number II
- [LeetCode] Single Number II, Solution
- LeetCode:Single Number II
- 【leetcode】Single Number II
- LeetCode Single Number I & II 都符合两个问题额外要求的 通用解法 与 思考过程
- leetcode Single Number II
- leetcode :Single Number II
- LeetCode: Single Number II
- leetcode -- Single Number II
- [LeetCode] Single Number II
- [LeetCode] Single Number II
- LeetCode-Single Number II
- Leetcode习题: SingleNumber II
- LeetCode_Single Number II
- [LeetCode]Single Number II
- [LeetCode]Single Number II