我正试图'暴力'一个数字谜题,其中一个标准是计算仅使用每个数字0-9一次。我首先从一堆变量中提取每个可能答案的各个数字(但将其更改为数组并不是一个大问题),但是确定它们是否是唯一的是一个甜瓜 - 它看起来像潜在的很多声明条件:如果a!= b&& b!= c&& !一个= C;这将是10个变量的长篇大论!
我错过了一个明显的伎俩吗?我正在使用C,但它可以使用Java;绝不是任何一位专家。
答案 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;
}
后缀 - ++
是一种写作的快捷方式,如果已经设置,我们想要突破;如果尚未设置,我们想要增加它(我们不关心是否在已经设置时增加它。