检查所有变量的值是不是不同的好方法

Posted

技术标签:

【中文标题】检查所有变量的值是不是不同的好方法【英文标题】:A good and fast way to check if values of all variables is distinct检查所有变量的值是否不同的好方法 【发布时间】:2013-03-28 00:27:41 【问题描述】:

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

编辑:非常感谢大家。完全忘记了赛特。我真是个菜鸟。

【问题讨论】:

查找java.util.Set “又好又快”取决于您是在寻找解决此特定问题的方法(数字限制在 0-9 之间)还是随着值的数量增加而扩展的通用解决方案。跨度> 真的是 9 个变量和 10 个可能的值 (0-9),还是您误报了问题? @mbeckish:感谢您的指点! 【参考方案1】:

将它们全部添加到一个 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。

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

【讨论】:

@maba OP 说:Consider 9 variables that can have values from to 0 to 9 each. 完全错过了 Set 的使用。谢谢你。现在问这个问题我觉得很傻:)答案已接受。 另外请注意,您可以在 for 循环中设置停止条件检查大小以提前停止。对于 9 个元素,这并不重要,但 9 个元素可能只是一个示例。【参考方案2】:

从设置位 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 好老的半晦涩的黑客;这让人觉得自己像个巫师。另外,这是最有效的方法,因为散列和直方图需要一些需要时间来构建的数据结构。【参考方案3】:

使用异或来查找重复的数字是一种技巧。

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

【讨论】:

【参考方案4】:

此算法适用于任何数字计数,但每个数字必须在区间 内,或者您可以将 maskbit 类型更改为 long间隔 .

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

【讨论】:

以上是关于检查所有变量的值是不是不同的好方法的主要内容,如果未能解决你的问题,请参考以下文章

Cedar - 检查是不是使用不同的值调用了两次方法

检查环境变量是不是存在的好习惯是啥?

在 C# 中检查 double 是不是为整数的好方法是啥? [复制]

检查不同其他列中每行的值是不是相同

检查SQL中的表中是不是连续出现两个不同的值?

Swift:检查来自同一类的 2 个对象是不是具有不同的值?