首页 > 代码库 > LeetCode——Single Number(II)
LeetCode——Single Number(II)
Single Number
Given an array of integers, every element appears twice except for one. Find that single one.
Single Number II
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?
思路:
这种类型的题目有两种思路:1、Map映射。2、位运算。
1、Map映射
可以使用使用map统计所有数值出现的次数,然后最后返回满足条件的值。
代码:
Single Number:
class Solution { public: int singleNumber(int A[], int n) { unordered_map<int, bool> ump_ii; for (int i = 0; i < n; i++) { if (!ump_ii.count(A[i])) ump_ii[A[i]] = true; else ump_ii.erase(A[i]); } return ump_ii.begin()->first; } };
Single Number II:
class Solution { public: int singleNumber(int A[], int n) { unordered_map<int, int> m; for (int i = 0; i < n; i++) { if (m.count(A[i]) == 0) { m[A[i]] = 1; } else if (m[A[i]] == 1) { m[A[i]] = 2; } else if (m[A[i]] == 2) { m.erase(A[i]); } } return m.begin()->first; } };2、位运算
Single Number:两个相同数的异或(^)值为0,Single Number中可以将所有的数求异或运算,那么值为所要求的Single Number。
所以代码为:
class Solution { public: int singleNumber(int A[], int n) { int num=A[0]; for(int i=1;i<n;i++){ num^=A[i]; } return num; } };Single Number II:对于除了出现一次之外的所有的整数,其二进制表示中每一位1出现的次数是3的整数倍,将所有这些1清零,剩下的就是最终的数。用ones记录到当前计算的变量为止,二进制1出现“1次”的数位。用twos记录到当前计算的变量为止,二进制1出现“2次”的数位。当ones和twos中的某一位同时为1时表示二进制1出现3次,此时需要清零。即用二进制模拟三进制计算。最终ones记录的是最终结果
代码:
class Solution { public: int singleNumber(int A[], int n) { int ones=0,twos=0,threes=0; for(int i=0;i<n;i++){ twos|=(ones&A[i]); ones=ones^A[i]; threes=(ones&twos); twos&=~threes; ones&=~threes; } return ones; } };当然进行位运算的时候我们可以将整数(int 32)一位一位运算。
代码:
class Solution { public: int singleNumber(int A[], int n) { int ans = 0; for (int i = 0; i < 32; i++) { int c = 0, d = 1<<i; for (int j = 0; j < n; j++) if (A[j] & d) c++; if (c%3) ans |= d; } return ans; } };
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。