确定变量中保存的值是否唯一

时间:2014-05-21 21:59:13

标签: java c algorithm

我正试图'暴力'一个数字谜题,其中一个标准是计算仅使用每个数字0-9一次。我首先从一堆变量中提取每个可能答案的各个数字(但将其更改为数组并不是一个大问题),但是确定它们是否是唯一的是一个甜瓜 - 它看起来像潜在的很多声明条件:如果a!= b&& b!= c&& !一个= C;这将是10个变量的长篇大论!

我错过了一个明显的伎俩吗?我正在使用C,但它可以使用Java;绝不是任何一位专家。

3 个答案:

答案 0 :(得分:0)

您需要使用提供set operations的数据结构 - 这使得唯一性测试像检查集合中是否已存在该值一样简单。

在Java中,Set interface及其实现是实现这种效果的最通用方式,如果只需要进行唯一性测试,则HashSet是最有效的。

那就是说,如果你只有一堆连续的整数来测试,那么BitSet可能是更合适的选择。或者,您甚至可以使用简单的布尔值数组来编写自己的位集:

boolean seen[] = new boolean[10];
...
// Mark digit 7 as seen
seen[7] = true;
...
// Test if digit 3 has been seen
if (seen[3]) {
    ...
}

答案 1 :(得分:0)

只需将您的数字投入一套,然后检查它是否已包含该密钥。即。

@Test
public void nTest() throws Exception{
    Set<Integer> numbers = new HashSet<Integer>();
    numbers.add(1);
    numbers.add(11);
    numbers.add(1111);

    Set<Integer> newNumbers = new HashSet<Integer>();
    newNumbers.add(1);
    newNumbers.add(11);     
    newNumbers.add(111);

    //adds 111 to list  
    for(int a : newNumbers){
        if(!numbers.contains(a)){numbers.add(a);}
    }               
}

答案 2 :(得分:0)

在C中,这是一种方法:

// use an array, not a bunch of separate variables
int the_numbers[NUM_NUMBERS]; 

// here we assume you have filled in the numbers and validated
// that they are all in the range 0-9

bool duplicate_found = false;

bool seen[10] = { 0 };

for (int ii = 0; ii < NUM_NUMBERS; ++ii)
    if ( seen[ the_numbers[ii] ]++ )
    {
         duplicate_found = true;
         break;
    }

后缀 - ++是一种写作的快捷方式,如果已经设置,我们想要突破;如果尚未设置,我们想要增加它(我们不关心是否在已经设置时增加它。