LeetCode: Single Number I && II
2015-05-23 18:44
399 查看
I title:
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?
思路:异或
II
title:
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?
思路:
这里我们需要重新思考,计算机是怎么存储数字的。考虑全部用二进制表示,如果我们把 第 ith 个位置上所有数字的和对3取余,那么只会有两个结果 0 或 1 (根据题意,3个0或3个1相加余数都为0). 因此取余的结果就是那个 “Single Number”.
一个直接的实现就是用大小为 32的数组来记录所有 位上的和。
这个算法是有改进的空间的,可以使用掩码变量:
假设在数组的开头连续出现3次5,则变化如下:
当第 ith 位出现3次时,我们就
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?
思路:异或
class Solution { public: int singleNumber(vector<int>& nums) { int single = nums[0]; for (int i = 1 ;i < nums.size(); i++){ single ^= nums[i]; } return single; } };
II
title:
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?
思路:
这里我们需要重新思考,计算机是怎么存储数字的。考虑全部用二进制表示,如果我们把 第 ith 个位置上所有数字的和对3取余,那么只会有两个结果 0 或 1 (根据题意,3个0或3个1相加余数都为0). 因此取余的结果就是那个 “Single Number”.
一个直接的实现就是用大小为 32的数组来记录所有 位上的和。
class Solution { public: int singleNumber(vector<int>& nums) { vector<int> v(32,0); int result = 0; for (int i = 0; i < 32; i++){ for (int j = 0 ;j < nums.size(); j++){ if ((nums[j] >> i) & 1) v[i]++; } result |= ((v[i] % 3) << i); } return result; } };
这个算法是有改进的空间的,可以使用掩码变量:
ones代表第ith 位只出现一次的掩码变量
twos代表第ith 位只出现两次次的掩码变量
threes代表第ith 位只出现三次的掩码变量
假设在数组的开头连续出现3次5,则变化如下:
ones = 101 twos = 0 threes = 0 -------------- ones = 0 twos = 101 threes = 0 -------------- ones = 0 twos = 0 threes = 101 --------------
当第 ith 位出现3次时,我们就
ones和
twos的第 ith 位设置为0. 最终的答案就是 ones。
class Solution { public: int singleNumber(vector<int>& nums) { int one = 0, two = 0, three = 0; for (int i = 0; i < nums.size(); i++){ two |= (one & nums[i]); one ^= nums[i]; three = one & two; one &= ~three; two &= ~three; } return one; } };
相关文章推荐
- LeetCode_Single Number&Single NumberII
- LeetCode Single Number I & II
- [Leetcode] #136#137#260 Single Number I & II & III
- LeetCode:Single Number I & II & III
- leetcode--single_number&&single_number_II
- [LeetCode]Single Number, Single Number II & Single Number III
- 【LeetCode】Single Number I & II & III
- LeetCode:Single Number I && II
- LeetCode Single Number I & II 都符合两个问题额外要求的 通用解法 与 思考过程
- Leetcode: single-number && single-number-ii
- LeetCode解题报告—— Sum Root to Leaf Numbers & Surrounded Regions & Single Number II
- 【leetcode】Single Number && Single Number II(ORZ 位运算)
- [Leetcode]Single Number && Single Number II
- leetcode -day8 Copy List with Random Pointer & Single Number I II
- 【LeetCode】136 & 137 & 260 - Single Number I & II &III
- 【leetcode】Single Number && Single Number II
- LeetCode Single Number I & II 都符合两个问题额外要求的 通用解法 与 思考过程
- LeetCode Single Number I & II 都符合两个问题额外要求的 通用解法 与 思考过程
- 【leetcode】Single Number & Single Number II
- leetcode -- Single Number II &III- 位操作,没有理解