http://introcs.cs.princeton.edu/java/14array/CouponCollector.java.html
好的,据我所知,如果
boolean[] found = new boolean
未初始化,它被赋予默认的布尔值,即false。但由于false的negatron是真的(!found[val]
),当所有布尔值都设置为默认值(false)时,这个条件是如何工作的呢?提前谢谢。
答案 0 :(得分:2)
检查后,无论发生什么情况,found[val]
都设置为true
。所以if (!found[val])
基本上意味着“如果我之前没有见过val
。”
最终结果是valcnt
最终成为唯一val
的计数。
答案 1 :(得分:2)
这里没有神秘感。我想你只是没有仔细阅读代码。以下是相关摘录及其“含义”。
boolean[] found = new boolean[N]; // found[i] = true if card i has been collected
found
的所有元素最初都是错误的。 (评论记录了found
数组的不变量。)
if (!found[val]) valcnt++;
如果!found[val]
为真(即found[val]
仍然为假),请递增计数器......
found[val] = true;
...并将found[val]
设置为true,以便我们不再计算此值。
答案 2 :(得分:0)
第一次有假。
int val = (int) (Math.random() * N);
这会产生一个随机数,所以在这个循环中可能会产生多于一个的五个。当第一次生成5时found[5]
为假,但第二次是真的,因此条件为假,不再会达到valcnt++;
。
答案 3 :(得分:0)
因为'val'是0到N-1之间的随机整数。在while循环中可能会出现两次相同的值,并且您希望仅在该索引处找到一次更新。