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

kar*_*aut 2 java algorithm

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

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

das*_*ght 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
}
Run Code Online (Sandbox Code Playgroud)

有关上一个条件中使用的位技巧的解释,请参阅此答案.


+你有十个可能的值和九个变量; 为了使九个值不同,它们必须从位掩码中清除十位中的九位,并且最初设置所有十位.从十位中删除九位会使您只设置一位1,这意味着结果是2的幂.


Boh*_*ian 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;
Run Code Online (Sandbox Code Playgroud)

该集完成所有工作,因为集只允许添加不同的值.如果任何值相同,则大小将小于9.

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