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と操作する.
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;
    }
};