2013-04-05 48 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 
相关问题