2013-04-05 51 views
2

考慮9個變量,每個變量的值可以從1到9。什麼是檢查每個變量是否具有獨特價值的好方法?我腦海中想到的第一個想法是總結它們,看看它是否等於n(n+1)/2,但這不是萬無一失。有任何想法嗎?檢查所有變量的值是否不同的一種很好且快速的方法

編輯:非常感謝你們。完全忘了Set。我是一個小白菜。

+2

查找'java.util.Set' – yshavit 2013-04-05 14:29:23

+0

「又好又快」取決於如果你正在尋找一個解決這個特殊問題(0-9數量有限)或隨着值數量增加而擴展的一般解決方案。 – mbeckish 2013-04-05 14:32:20

+2

它是真的9個變量和10個可能的值(0-9),還是你誤解了這個問題? – mbeckish 2013-04-05 14:33:54

回答

5

它們全部添加到一個集,並檢查集合的大小是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.

該技術適用於任何類別的值類型,任何範圍和任意數量的值。

+1

@maba OP表示:「考慮9個變量,每個變量的值可以從0到9。 – 2013-04-05 14:33:11

+1

@ Eng.Fouad哦,你是對的...剛讀0到9.我的壞... – maba 2013-04-05 14:33:44

+0

完全錯過了Set的使用。謝謝。我現在感到很傻,問這個問題:)答案接受。 – karmanaut 2013-04-05 14:37:35

5

從位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,這意味着結果是二的冪。

+0

+1良好的舊半隱晦有點hackery;這讓人感覺像巫師。此外,它是最有效的方法,因爲哈希和直方圖將需要一些需要時間構建的數據結構。 – 2013-04-05 17:59:08

4

使用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 
相關問題