首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >查找数组值的差值等于该值的次数

查找数组值的差值等于该值的次数
EN

Code Review用户
提问于 2014-09-16 21:42:26
回答 4查看 372关注 0票数 5

我编写了下面的代码来回答这个问题,但是我想知道是否有更好的方法。

,例如

如果给出了以下数组:

{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<<<

代码语言:javascript
复制
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

EN

回答 4

Code Review用户

回答已采纳

发布于 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,这不是集合的一部分,因此您必须放弃这一对。

代码语言:javascript
复制
int checkDifferences(Set<Integer> numbers, int difference) {
    int occurrences = 0;
    for (Integer number : numbers) {
        if (numbers.contains(number + difference)) {
            occurrences++;
        }
    }
    return occurrences;
}
票数 7
EN

Code Review用户

发布于 2014-09-16 22:51:10

初始化List

您的List<Integer>可以初始化如下:

代码语言:javascript
复制
 List<Integer> a = Arrays.asList(10, 21, 34, 45, 56);

实际上,当您处理一个固定长度的大小列表时,您可以只使用一个常规数组。

代码语言:javascript
复制
 int[] a = new int[]{ 10, 21, 34, 45, 56 };

间距

我强烈建议在for-循环中使用更多的空间:

代码语言:javascript
复制
   for (int i = 0; i < a.size(); i++) {
       for (int j = 0; j < a.size(); j++) {
           if (j != i) {

这不是更可读的吗?至少对我来说是这样。

变量名

您使用的方式太多了,变量名只有一个字母。我建议把它们重新命名如下:

  • a -> numbers
  • i -> firstNumber
  • j -> secondNumber
  • t -> difference
票数 7
EN

Code Review用户

发布于 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);

为了避免这种低效率,最好使用基元数组来代替:

代码语言:javascript
复制
int[] a = { 10, 21, 34, 45, 56 };
票数 3
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/63083

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档