leetcode-137-Single Number II
2017-01-13 09:58
330 查看
问题
题目:[leetcode-137]思路
这个题的思路比较通用,对于出现k次的也一样可以处理。这个题的思路是位运算,但是并没有用到常用的位运算符。主要是位运算的思想在里面。具体步骤如下:
对于每一个数用位向量表示。
统计所有数字各个位的和。
最后,位向量每一位模k
进行上面的操作之后,剩下的位向量就是出现一次的那个数的位向量表示。还原回来就行。
不过,做的时候有坑。要小心。
下面先贴一段错误代码
代码(错误)
class Solution { public: int singleNumber(vector<int>& nums) { int bit[32]; std::memset( bit, 0, sizeof(bit) ); int sz = nums.size(); for( int i = 0; i < sz; ++i ) { int idx = 0; while( nums[i] ) // 没有考虑负数的D2B { int mod = nums[i]%2; nums[i] /= 2 ; bit[idx++] += mod; } } int ret = 0; for( int i = 0, base = 1; i < 32; ++i, base *= 2 ) { ret += (bit[i]*base); // 没有考虑负数的B2D } return ret; } };
上面的代码主要有两处错误,都是没有考虑负数的问题引起的。就是负数D2B和B2D的表示。
D2B:前者是考虑与其位向量表示一致的无符号数,借助无符号数转化为位向量。
B2D:后者是没有考虑最高位的负权。
代码(正确)
class Solution { public: int singleNumber(vector<int>& nums) { int bit[32]; std::memset( bit, 0, sizeof(bit) ); int sz = nums.size(); for( int i = 0; i < sz; ++i ) { int idx = 0; unsigned val = (unsigned)nums[i];// 借助无符号数 while( val ) { int mod = val%2; val >>=1 ; bit[idx++] += mod; } } int ret = 0; for( int i = 0, base = 1; i < 32; ++i, base *= 2 ) { bit[i] %= 3; if(i<31){ ret += (bit[i]*base); } else{ ret += (bit[i]*(-base));// 最高位负权 } } return ret; } };
相关文章推荐
- leetcode[137]:Single Number II
- LeetCode - 137 - Single Number II
- leetcode[137] Single Number II
- leetcode-137 Single Number II
- LeetCode 137 Single Number II(仅仅出现一次的数字 II)(*)
- 【LeetCode】136 & 137 & 260 - Single Number I & II &III
- [leetcode 137] Single Number II
- [LeetCode] 137--Single Number II --Medium--
- leetcode(137)数组之Single Number II
- 137.leetcode Single Number II(medium)[单数 三次]
- 【leetcode】[137]Single Number II
- Leetcode 137 Single Number II
- LeetCode137:Single Number II
- LeetCode 137 Single Number II
- [Leetcode 137, Medium] Single Number II
- leetcode[137]Single Number II
- [LeetCode]题解(python):137-Single Number II
- leetcode137 Single Number II java
- leetcode——137—— Single Number II
- 137. Single Number II LeetCode