http://introcs.cs.princeton.edu/java/14array/CouponCollector.java.html理解ブール!配列[i]は、javaの
オーケーで、私が理解からして、それが偽であるデフォルトブール値、が割り当てられています。しかし、falseのnegatronがtrue(!found[val]
)なので、ブール値のすべてがデフォルト(false)に設定されていると、この条件がどのように機能するのでしょうか?前もって感謝します。
http://introcs.cs.princeton.edu/java/14array/CouponCollector.java.html理解ブール!配列[i]は、javaの
オーケーで、私が理解からして、それが偽であるデフォルトブール値、が割り当てられています。しかし、falseのnegatronがtrue(!found[val]
)なので、ブール値のすべてがデフォルト(false)に設定されていると、この条件がどのように機能するのでしょうか?前もって感謝します。
ここに謎はありません。私はコードを慎重に読まなかったと思います。関連するスニペットとその意味を以下に示します。
boolean[] found = new boolean[N]; // found[i] = true if card i has been collected
found
のすべての要素は最初は偽です。 (コメントはfound
アレイの不変を文書化している。)
if (!found[val]) valcnt++;
!found[val]
がtrueの場合はカウンタをインクリメントする(すなわち、それfound[val]
はまだ偽である)...
found[val] = true;
...とのセットをfound[val]
をtrueに設定して、このvalを再度カウントしないようにします。
ありがとう!私の心はちょうどこれを読んだ後にクリックした。私は今、とても愚かな気分です。 – user1164937
私はあなたをアップアップできません:( – user1164937
初めて誤っています。
int val = (int) (Math.random() * N);
これは乱数を生成するので、このループではより多くの1つの発言が生成されることがあります。最初の時刻に5が生成された場合、found[5]
はfalseですが、2回目にtrueになるため、条件はfalseになり、もう一度valcnt++;
には到達しません。
チェック後、何が起きても、found[val]
はtrue
に設定されます。だからif (!found[val])
は基本的には "私がこの前にval
を見たことがない"という意味です。
最後に、valcnt
は一意の数であるval
で終了します。
'val'は0とN-1の間のランダムな整数です。同じ値がwhileループで2回発生し、そのインデックスで見つかったものを一度だけ更新したいとします。
あなた自身の質問に答えられませんでしたか? – BrokenGlass
あなたがそう言うなら、私は私が上のやり方を思いついたのを見たと思う。例えば、!found [val]には、(デフォルト値のために)!falseと表示されます。しかし、今私はそれがそのように動作しないと思いますか? idk、私はそれを言葉に入れて苦労している。私はかなりこの物に新しいです:\ – user1164937