考慮9個變量,每個變量的值可以從1到9。什麼是檢查每個變量是否具有獨特價值的好方法?我腦海中想到的第一個想法是總結它們,看看它是否等於n(n+1)/2
,但這不是萬無一失。有任何想法嗎?檢查所有變量的值是否不同的一種很好且快速的方法
編輯:非常感謝你們。完全忘了Set。我是一個小白菜。
考慮9個變量,每個變量的值可以從1到9。什麼是檢查每個變量是否具有獨特價值的好方法?我腦海中想到的第一個想法是總結它們,看看它是否等於n(n+1)/2
,但這不是萬無一失。有任何想法嗎?檢查所有變量的值是否不同的一種很好且快速的方法
編輯:非常感謝你們。完全忘了Set。我是一個小白菜。
它們全部添加到一個集,並檢查集合的大小是9
例如,要檢查是否9 int
陣列都不同:
int[] array = new int[9];
// fill array
Set<Integer> set = new HashSet<Integer>();
for (int i : array)
set.add(i);
boolean allDistinct = set.size() == 9;
該組做所有的工作,因爲集只允許添加不同的值。如果任何值相同,則尺寸將小於9.
該技術適用於任何類別的值類型,任何範圍和任意數量的值。
從位0到位9的位掩碼開始,然後清除對應於每個變量值的位。如果得到的位掩碼是2的冪,則所有值都不同+;否則,有重複。
int a, b, c, d, e, f, g, h, i;
int mask = 0x3FF; // bits zero through 9 are set
mask &= ~(1<<a);
mask &= ~(1<<b);
...
mask &= ~(1<<i);
if ((mask & -mask) == mask) {
// all bits were distinct
}
查看this answer瞭解最後一個條件中使用的位技巧的解釋。
1
,這意味着結果是二的冪。
+1良好的舊半隱晦有點hackery;這讓人感覺像巫師。此外,它是最有效的方法,因爲哈希和直方圖將需要一些需要時間構建的數據結構。 – 2013-04-05 17:59:08
使用XOR來查找重複的號碼是一個竅門。
int[] arr = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 5, 9 };
int answer = 0;
for (int i = 0; i < arr.length; i++) {
answer = answer^(arr[i] + 1)^i;
}
System.out.println(answer - 1);
輸出:
5
查找'java.util.Set' – yshavit 2013-04-05 14:29:23
「又好又快」取決於如果你正在尋找一個解決這個特殊問題(0-9數量有限)或隨着值數量增加而擴展的一般解決方案。 – mbeckish 2013-04-05 14:32:20
它是真的9個變量和10個可能的值(0-9),還是你誤解了這個問題? – mbeckish 2013-04-05 14:33:54