Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 一种检查所有变量值是否不同的快速好方法_Java_Algorithm - Fatal编程技术网

Java 一种检查所有变量值是否不同的快速好方法

Java 一种检查所有变量值是否不同的快速好方法,java,algorithm,Java,Algorithm,考虑9个变量,每个变量的值从到1到9。检查每个变量是否有不同值的好方法是什么。我想到的第一个想法是把它们加起来,看看它是否等于n(n+1)/2,但这并不是万无一失的。有什么想法吗 编辑:非常感谢各位。完全忘了布景。我真是个傻瓜。将它们全部添加到一个集合中,并检查集合的大小是否为9 例如,要检查9int的数组是否都不同: int[] array = new int[9]; // fill array Set<Integer> set = new HashSet<Integer&g

考虑9个变量,每个变量的值从到1到9。检查每个变量是否有不同值的好方法是什么。我想到的第一个想法是把它们加起来,看看它是否等于
n(n+1)/2
,但这并不是万无一失的。有什么想法吗


编辑:非常感谢各位。完全忘了布景。我真是个傻瓜。

将它们全部添加到一个集合中,并检查集合的大小是否为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;
int[]数组=新的int[9];
//填充数组
Set=newhashset();
for(int i:array)
增加(i);
布尔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
}
inta、b、c、d、e、f、g、h、i;
int mask=0x3FF;//设置位0到9
掩码&=~(1<用于解释上一个条件中使用的位技巧



+您有十个可能的值和九个变量;为了使这九个值不同,它们必须在初始设置所有十位的情况下从位掩码中清除十位中的九位。删除十位中的九位只会将一位设置为
1
,这意味着结果是二的幂。

使用异或查找重复的n乌姆是个骗局

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);

此算法适用于任何数字计数,但每个数字必须在间隔内,或者您可以将掩码和位类型更改为long for interval

int[]数字={0,1,2,3,3,5,6,7};
int-mask=0;
用于(整数:数字){
整数位=1(0){
System.out.println(“发现重复”+编号);
返回;
}
掩码|=位;
}
System.out.println(“无重复”);

look up
java.util.Set
“好且快”取决于您是在寻找解决此特定问题的解决方案(数字限制在0-9之间)还是一个随着值的数量增加而扩展的通用解决方案。它真的是9个变量和10个可能的值(0-9),还是你把问题说错了?@mbeckish:谢谢你指出了这一点@maba OP说:
考虑9个变量,每个变量的值从0到9
。完全没有使用Set。非常感谢。我觉得现在问这个问题很傻:)答案被接受。还请注意,您可以在for循环中设置一个停止条件来检查大小,以便提前停止。对于9个元素来说,这并不重要,但9个元素可能只是一个例子;这让人觉得自己像个巫师。另外,这是最有效的方法,因为散列和直方图需要一些数据结构,这些数据结构需要花费时间来构建。
5
int[] numbers = {0, 1, 2, 3, 3, 5, 6, 7};

int mask = 0;
for (int number : numbers) {
    int bit = 1 << number;

    if ((mask & bit) > 0) {
        System.out.println("Found duplicity " + number);
        return;
    }

    mask |= bit;
}

System.out.println("No duplicity");