leetcodeのSingle Number II
1912 ワード
原題:
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?
このような問題には、k回同じものがあれば、次のような問題があります.
intタイプを採用しているため、intクラスは一般的に32ビットであり、保険のため(私などのスラグではintが何ビットあるか分からない)、sizeof(int)サイズを定義する配列を採用することができるが、元の配列A[]では、ある数字を除いてすべての数字がk回現れるため、このk数字の各桁は同じであるため、対応するビットのbitを加算し、きっとk倍、%kの後に0になって、このある数字を加えて...したがって、A[]の対応するbitビットをすべて加算して%3にし、この数字を得ることができます.
私が使った方法では、配列内のすべての数字の和(0から31ビット)を保存する配列record[]を定義し、record[0]がintの最後のbitの和を保存するために使用され、順次類推され、その後、残りの3は、配列の各bitをintに再ロードします.
配列のシフト:本解決法ではintシフトを2回用いた
1:抽出:配列中のビットを抽出し、1つの1で、1ビット左に移動するたびに1つの数字と、この数字の各ビットの数値を得る
2:マウント:1つの配列の01からintを構成し、1つのresultを0と定義し、recordの各数字に対応し、例えばrecord[i]はintが右からi番目のbitを表し、iビットをシフトしてresultと操作する.
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?
このような問題には、k回同じものがあれば、次のような問題があります.
intタイプを採用しているため、intクラスは一般的に32ビットであり、保険のため(私などのスラグではintが何ビットあるか分からない)、sizeof(int)サイズを定義する配列を採用することができるが、元の配列A[]では、ある数字を除いてすべての数字がk回現れるため、このk数字の各桁は同じであるため、対応するビットのbitを加算し、きっとk倍、%kの後に0になって、このある数字を加えて...したがって、A[]の対応するbitビットをすべて加算して%3にし、この数字を得ることができます.
私が使った方法では、配列内のすべての数字の和(0から31ビット)を保存する配列record[]を定義し、record[0]がintの最後のbitの和を保存するために使用され、順次類推され、その後、残りの3は、配列の各bitをintに再ロードします.
配列のシフト:本解決法ではintシフトを2回用いた
1:抽出:配列中のビットを抽出し、1つの1で、1ビット左に移動するたびに1つの数字と、この数字の各ビットの数値を得る
2:マウント:1つの配列の01からintを構成し、1つのresultを0と定義し、recordの各数字に対応し、例えばrecord[i]はintが右からi番目のbitを表し、iビットをシフトしてresultと操作する.
class Solution {
public:
int singleNumber(int A[], int n) {
// IMPORTANT: Please reset any member data you declared, as
// the same Solution instance will be reused for each test case.
int length = sizeof(int)*8 ;
int * record = new int[length];
for (int i = 0 ; i < length;i++){
record[i] = 0;
}
for (int i = 0; i < n ; i++){
// 1 A[i] , A[i] bit
for (int j = 0; j < length ; j ++){
// 0 bit 1, record[]
if( ((1<<j) & A[i] )!=0){
record[j] += 1 ;
}
}
}
// ,
for (int i = 0; i < length; i++){
record[i] = record[i]%3;
}
int result = 0;
for (int i = 0 ; i < length ; i ++){
result = result | (record[i]<<i);
}
return result;
}
};