考虑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