我编写了下面的代码来回答这个问题,但是我想知道是否有更好的方法。
如果给出了以下数组:
{10,21,34,45,56}
我们应该找到每个数字与数组的其他值的区别,如果它等于11,则应该增加计数器。
10-21=-11 10-34=-24 10-45=-35 10-56=-46 21-10=11 < 21-34=-13 21-45=-24 21-56=-24 21-56=-35 34-10=24 34-21=-11 34-45=-22 45-10=35 45-21=11 << 45-34=11 <<< 45-56=46 56-21=35 56-34=22 56-45-45=11<<<
List<Integer> a = new ArrayList<Integer>();
a.add(10);
a.add(21);
a.add(34);
a.add(45);
a.add(56);
int number = 11;
int counter = 0;
for(int i=0;i<a.size();i++){
for(int j=0;j<a.size();j++){
if(j!=i){
int t = a.get(i) - a.get(j);
if(t == number){
System.err.println(a.get(i) +"-"+ a.get(j) + "=" + t);
counter++;
}
}
}
}
System.err.println(counter);
}应用程序显示的结果是正确的,但我想知道是否还有其他方法可以解决上述问题。
21-10=11 45-34=11 56-45=11 3
发布于 2014-09-16 22:06:48
我认为你应该以一种不同的方式来看待这个问题,并想出一个更简单的解决方案。
试着考虑有一套元素。您想知道的是,是否有任何像a - b = x这样的元素。
您将获得x,因此对于集合中给定的a值,您应该检查它是否也包含x + a。
您的实现应该首先将列表的内容移到Set中。然后,您必须遍历该集合,并对每个元素a检查该集合是否也包含x + a。如果是真的,那么应该将(a,b)添加到解决方案中。
在您的示例中,x = 11。如果您考虑a = 10,您将检查它是否包含11 + 10 = 21。它这样做,您就可以对(21,10)是有效的解决方案。相反,当您考虑a = 21时,您获得了b = 32,这不是集合的一部分,因此您必须放弃这一对。
int checkDifferences(Set<Integer> numbers, int difference) {
int occurrences = 0;
for (Integer number : numbers) {
if (numbers.contains(number + difference)) {
occurrences++;
}
}
return occurrences;
}发布于 2014-09-16 22:51:10
List您的List<Integer>可以初始化如下:
List<Integer> a = Arrays.asList(10, 21, 34, 45, 56);实际上,当您处理一个固定长度的大小列表时,您可以只使用一个常规数组。
int[] a = new int[]{ 10, 21, 34, 45, 56 };我强烈建议在for-循环中使用更多的空间:
for (int i = 0; i < a.size(); i++) {
for (int j = 0; j < a.size(); j++) {
if (j != i) {这不是更可读的吗?至少对我来说是这样。
您使用的方式太多了,变量名只有一个字母。我建议把它们重新命名如下:
a -> numbersi -> firstNumberj -> secondNumbert -> difference发布于 2014-09-17 04:59:38
int值将在这里自动装箱:
List a=新ArrayList();a.add(10);a.add(21);// .
然后在嵌套for for的每一次迭代中取消装箱:
T= a.get(i) - a.get(j);
为了避免这种低效率,最好使用基元数组来代替:
int[] a = { 10, 21, 34, 45, 56 };https://codereview.stackexchange.com/questions/63083
复制相似问题