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

时间:2013-04-05 14:27:42

标签: java algorithm

考虑9个变量,每个变量的值可以从1到9。什么是检查每个变量是否具有不同值的好的快速方法。我想到的第一个想法是总结它们,看它是否等于n(n+1)/2,但这无处不在。有什么想法吗?

编辑:非常感谢你们。完全忘记了Set。我是个菜鸟。

4 个答案:

答案 0 :(得分:6)

从设置了位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,这意味着结果是2的幂。

答案 1 :(得分:5)

将它们全部添加到Set中,并检查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.

此技术适用于任何类型的值类型,任何范围和任意数量的值。

答案 2 :(得分: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

答案 3 :(得分:0)

此算法可处理任何数量的数字,但每个数字必须在间隔<0,31>中,否则您可以将 mask bit 类型更改为long间隔<0,63>。

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