落单的数 II-LintCode
2017-07-03 13:26
288 查看
给出3*n + 1 个的数字,除其中一个数字之外其他每个数字均出现三次,找到这个数字。
样例:
给出 [1,1,2,3,3,3,2,2,4,1] ,返回 4
挑战 :
一次遍历,常数级的额外空间复杂度
思想:
利用位运算,若一个数字出现3次,则该数字的二进制表示中每个位置数值为1出现的次数均为3次。用one表示出现一次,two表示出现两次,three表示出现三次。出现两次即为one中出现一次,之后A[i]中又出现;出现一次,则不能在A[i]再出现,要用异或;three为one中出现一次,two中出现两次;之后将one和two中出现三次的位置均清空(置零)。
样例:
给出 [1,1,2,3,3,3,2,2,4,1] ,返回 4
挑战 :
一次遍历,常数级的额外空间复杂度
思想:
利用位运算,若一个数字出现3次,则该数字的二进制表示中每个位置数值为1出现的次数均为3次。用one表示出现一次,two表示出现两次,three表示出现三次。出现两次即为one中出现一次,之后A[i]中又出现;出现一次,则不能在A[i]再出现,要用异或;three为one中出现一次,two中出现两次;之后将one和two中出现三次的位置均清空(置零)。
#ifndef C83_H #define C83_H #include<iostream> #include<vector> using namespace std; class Solution { public: int singleNumberII(vector<int> &A) { int one = 0; int two = 0; int three = 0; for (int i = 0; i < A.size(); ++i) { two |= one&A[i]; one ^= A[i]; three = one&two; one = one&~three; two = two&~three; } return one; } }; #endif
相关文章推荐
- LintCode 落单的数 II
- ***[Lintcode]Single Number II 落单的数 II
- lintcode 落单的数 II
- LintCode-落单的数 II
- lintcode-83-落单的数 II
- lintcode 中等题:Singleton number II 落单的数 II
- Lintcode 落单的数 II
- lintcode,落单的数 II
- Lintcode落单的数 删除排序数组中的重复数字 II
- 寻找旋转排序数组中的最小值 II -LintCode
- lintcode-easy-Remove Duplicates from Sorted Array II
- 二叉树的层次遍历 II,lintcode
- lintcode-medium-Backpack II
- lintcode-medium-Reverse Linked List II
- lintcode-medium-Sort Colors II
- 螺旋矩阵 II -LintCode
- [Lintcode] #70 二叉树的层次遍历 II
- LintCode : Jump Game II
- [LintCode]Find the Missing Number II
- 删除排序链表中的重复数字 II -LintCode