【1日1問】22:1回しか出ない数字(質問の概要回答)

タイトル1の説明

空でない整数配列が与えられた場合、要素が1回だけ出現することを除いて、他の各要素は2回出現します。一度だけ現れる要素を見つけます。

説明:

アルゴリズムは、線形時間の複雑さを持っている必要があります。あなたは余分なスペースを使わずにそれを行うことができますか?

例1:

输入: [2,2,1]
输出: 1

問題コード

class Solution {
public:
    int singleNumber(vector<int>& nums) {
        int sum = 0;
        for(auto i : nums){
            sum ^= i;
        }
        return sum;
    }
};

トピック2の説明

空でない整数配列が与えられた場合、要素が1回だけ出現することを除いて、他のすべての要素は3回出現します。一度だけ現れる要素を見つけます。

説明:

アルゴリズムは、線形時間の複雑さを持っている必要があります。あなたは余分なスペースを使わずにそれを行うことができますか?

例1:

输入: [2,2,3,2]
输出: 3

問題コード

class Solution {
public:
    int singleNumber(vector<int>& nums) {
        int sz = nums.size();

        int sum = 0;
        
        for(int i = 0; i < 32; ++i){
            int count = 0;
            for(auto j : nums){
                count += j >> i & 1;
            }
            if(count % 3){
                sum += 1 << i;
            }
        }
        
        /*int sum = 0, tmp = 0;
		for (auto &i : nums)
		{
			sum = (sum ^ i) & ~tmp;
			tmp = (tmp ^ i) & ~sum;
		}*/
		
        return sum;
    }
};

トピック3の説明

整数配列numsが与えられると、1回だけ現れる2つの要素があり、他のすべての要素は2回現れる。一度だけ現れる2つの要素を見つけます。

例:

输入: [1,2,1,3,2,5]
输出: [3,5]

問題コード

class Solution {
public:
    vector<int> singleNumber(vector<int>& nums) {
        int sum = 0;
        for(auto i : nums){
            sum ^= i;
        }

        //就是保留sum的最后一个1,并且将其他位变为0(记录其大小)
        int k = sum & (-sum); 

        vector<int> num(2, 0);
        for(auto i : nums){
            if(i & k){
                num[0] ^= i;
            }
            else{
                num[1] ^= i;
            }
        }
        
        return num;
    }
};

別の意見がある場合は、メッセージを残して議論してください!

元の記事を152件公開 賞賛されている45件 10,000回以上の閲覧

おすすめ

転載: blog.csdn.net/AngelDg/article/details/105168911