ACWING74。数字のみの配列に一度だけ表示されます(安全プランを証明するために、ステートマシン、バイナリ)

一度だけの数が表示さに加えてアレイでは、他の図は、3回登場しています。

一度だけ表示される番号を検索します。

あなたは数字の条件が満たさなければならないと仮定することができます。

質問:

それだけではO(n)時間と追加のO(1)スペースを必要とする場合、どのようにそれを行うには?
サンプル
入力:[1,1,1,2,2,2,3,4,4,4]

出力:3

参考ます。https://leetcode-cn.com/problems/shu-zu-zhong-shu-zi-chu-xian-de-ci-shu-ii-lcof/solution/zhuang-tai-ji-jie-jue- CI-WEN-TI-翔杰-集-ZI-D /

ちょうどそれがここで回路設計上の問題に直面するだろう、電気工事の数を書き終えていたが、本当に知識がああ連結されています。

アイデア:
解決策1:数字、1ビットずつの数の統計のすべて、金型13の数は、1以上、このビットが1の場合。

対処方法2:
非常に巧妙な、ステートマシンの知識を使って。しかし、この質問は、限りの知識が十分である回路設計(またはビット操作を)知っています。

2つの2進数を利用することができる:ABを、三元ビットの状態、I 3の値の数を表すを表すために使用されます。

= 0、B = 0と初期化
値は0:= 0、B = 0
、1:= 1、B = 0
2:= 0、B = 1

加えC、C 0は入力されていない値を仮定し、cは1であることが入力されます

真理値表に示すように
ここに画像を挿入説明
真理値表を描くことができる
New_a = A'B'C「+ ab'c

:A用の
新しい_a = B '(AC + A'C')= C&A ^ B '

Bの場合:
この場合、変換はNew_aに行われました。
同じNew_a、B、Cを用いて、
得ることができる:
B = New_a'bc 'New_a'b'c +
B =新しい_A'(B ^ C)

class Solution {
public:
    int findNumberAppearingOnce(vector<int>& nums) {
        int a = 0,b = 0;
        int n = nums.size();
        for(int i = 0;i < n;i++) {
            a = (a ^ nums[i]) & ~b;
            b = (b ^ nums[i]) & ~a;
        }
        return a;
    }
};

直接初期の真理値表A、B、Cを記述しない場合は簡素化

class Solution {
public:
    int findNumberAppearingOnce(vector<int>& nums) {
        int a = 0,b = 0;
        int n = nums.size();
        for(int i = 0;i < n;i++) {
            int x = a;
            a = (x & ~b & ~nums[i]) | (~x & ~b & nums[i]);
            b = (~b & nums[i] & x) | (b & ~nums[i] & ~x);
        }
        return a;
    }
};

公開された843元の記事 ウォン称賛28 ビュー40000 +

おすすめ

転載: blog.csdn.net/tomjobs/article/details/105001697