[LeetCode]*137.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?
【題意】
給定一個整數數組,每個元素出現了三次,除了一個。找出那個出現一次的數字。
注意:
你的算法應該在一個線性時間複雜度完成。你能不能無需使用額外的內存來完成它?
【思路一】
所有的數用二進製表示,我們把每個數的第i 位取和之後再對3取餘,那麼隻會有兩個結果 0 或 1 。 如果為0代表隻出現一次的那個數第i位也為0,
如果為1表示隻出現一次的那個數第i位也為1。因此取餘的結果就是那個 “Single Number”。
下麵是一個直接用大小為 32的數組來記錄所有 位上的和。
【代碼一】
/*---------------------------------------
* 日期:2015-04-26
* 作者:SJF0115
* 題目: 137.Single Number II
* 網址:https://leetcode.com/problems/single-number-ii/
* 結果:AC
* 來源:LeetCode
* 博客:
-----------------------------------------*/
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
class Solution {
public:
int singleNumber(int A[], int n) {
int count[32] = {0};
int result = 0;
for(int i = 0;i < 32;++i){
for(int j = 0;j < n;++j){
if ((A[j] >> i) & 1) {
++count[i];
}//if
}//for
result |= ((count[i] % 3) << i);
}//for
return result;
}
};
int main(){
Solution solution;
int A[] = {2,3,4,2,5,2,3,3,5,5};
int result = solution.singleNumber(A,10);
// 輸出
cout<<result<<endl;
return 0;
}
【思路二】
這個算法是有改進的空間的,可以使用掩碼變量
方法 2:用 ones 記錄到當前處理的元素為止,二進製 1 出現“1 次”(mod 3 之後的 1)的有哪些二進製位;
用 twos 記錄到當前計算的變量為止,二進製 1 出現“2 次”(mod 3 之後的 2)的有哪些二進製位。
當 ones 和 twos 中的某一位同時為 1 時表示該二進製位上 1 出現了 3 次,此時需要清零。
即用二進製模擬三進製運算。最終 ones 記錄的是最終結果。
【代碼二】
/*---------------------------------------
* 日期:2015-04-26
* 作者:SJF0115
* 題目: 137.Single Number II
* 網址:https://leetcode.com/problems/single-number-ii/
* 結果:AC
* 來源:LeetCode
* 博客:
-----------------------------------------*/
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
class Solution {
public:
int singleNumber(int A[], int n) {
int ones = 0, twos = 0, threes = 0;
for(int i = 0;i < n;++i){
// 出現2次
twos |= (ones & A[i]);
// 出現1次
ones ^= A[i];
// 當ones和twos中的某一位同時為1時表示該二進製位上1出現了3次
threes = ones & twos;
// 二進製位上1出現了3次此時ones和twos對應位上清零
ones &= ~threes;
twos &= ~threes;
}//for
return ones;
}
};
int main(){
Solution solution;
int A[] = {2,3,4,2,5,2,3,3,5,5};
int result = solution.singleNumber(A,10);
// 輸出
cout<<result<<endl;
return 0;
}
最後更新:2017-04-03 12:54:49