可分的和对

问题描述 投票:2回答:3

虽然看到这个问题会很奇怪,但在我继续编码的过程中,我真的需要了解一些核心概念。我有一个关于Hackerrank的问题就像:DIVISIBLE SUM PAIRS

无论如何我会在这里给出问题陈述:

问题陈述

给定一个数组,我们必须找到可被给定数k整除的对的数​​量,并且还有一个条件,即:来自这些对的arr [i] <arr [j]。

例如,ar=[1,2,3,4,5,6]k=5。我们符合标准的三对是[1,4] [2,3][4,6]

在我发布我的代码之前,我想告诉你我的代码已经通过了所有的测试用例,并且可以接受下一个挑战,但是有一个小问题,我想弄清楚,这是在代码中。

static int divisibleSumPairs(int n, int k, int[] ar) {
    int count = 0;
    for(int i=0; i<ar.length; i++){
      for(int j=i+1; j<ar.length; j++){
            if(((ar[i]+ar[j])%k)==0){
                if(i < j)
                   count++;
            }
        }
    }
    return count;
}

在这里,当我这样做if(i < j) count++,它给了我正确的结果,但是一旦我这样做if(ar[i] < a[j]) count++,它应该给我一个错误的答案。

任何人都可以帮助我解决这个问题,就像剩下的那样。因为我知道检查arr[i] < arr[j]应该给出正确的结果。我不想继续使用错误的知识。

EDITS

因为我明白我做错了什么。我在我的代码中有一个编辑没有用1启动内部循环,因为每次内部循环结束时它将以1开始,并再次运行。我感谢所有帮助我清除这一点的人,并使我的概念足够强大,可以处理这样的问题。

我个人感谢Mike 'Pomax' KamermansRicolaxerx593清除我的疑虑,并给我循环元素的核心概念。它将来会对我有所帮助,我不会再重复那件事了。 :)

java arrays
3个回答
7
投票

我刚检查了你的链接,问题陈述中给出的条件是

查找并打印(i,j)对的数量,其中i <j和ar [i] + ar [j]可被k整除。

这只是元素的unordered pairs数,其总和可被k整除。

不过你写的

还有一个条件,即:来自这些对的arr [i] <arr [j]。

我好像你误解了这个问题。它解释了为什么i<j条件有效,而arr[i] < arr[j]没有。


既然你知道你只需要无序对,就不需要将j1迭代到ar.length。既然你需要j > ij1(包括)之间的每个i都是无用的。您可以将代码简化为:

static int divisibleSumPairs(int n, int k, int[] ar) {
    int count = 0;
    for(int i=0; i<ar.length-1; i++){
      for(int j=i+1; j<ar.length; j++){
            if(((ar[i]+ar[j])%k)==0){
                   count++;
            }
        }
    }
    return count;
}

2
投票

温你做i = {0 ... 10}j = {1 ... 10},然后有(约)100 cmobinations(i和j),(约)50,其中i <j,其余反之亦然。所以你的假设是错误的,那:

据说给我一个错误的答案

...它给你正确错误的答案! ...自从a[i] + a[j] % k == 0,然后a[j] + a[i] % k == 0也!

如果你不包括if(i < j),你可以加倍计算(对的出现次数)。

(实施)替代方案是:

for (int i = 0; i < ar.length; i++) {
  // ensure i < j via initialization ;)
  for (int j = i + 1; j < ar.length; j++) {
    if (((ar[i]+ar[j]) % k) == 0) {
      counter++;
    }
  }
}

...用i + 1而不是1初始化内循环。


编辑:(在得到更好的问题后)

你的假设,a[i] > a[j]等同于i > jj < i(但不是两者),几乎是正确的:除了a[i] == a[j]


0
投票

这个解决方案是使用javaScript:

 divisibleSumPairs (n, k, ar) => {
  let count = 0;
  ar = ar.map((value, index, arr) => {
    for (let i = index + 1; i <= arr.length; i++) {
      if ((value + arr[i]) % k === 0) {
        count++;
      }
    }
  });
  return count
}
© www.soinside.com 2019 - 2024. All rights reserved.