可分和对

时间:2019-01-14 19:24:09

标签: java arrays

虽然看到这个问题很奇怪,但是在继续编码之旅的同时,我确实需要理解一些核心概念。我在Hackerrank上遇到问题,它的问题是:DIVISIBLE SUM PAIRS

无论如何,我将在此处给出问题说明:

问题陈述

给出一个数组,在该数组中,我们必须找到可被给定数 k 整除的对数,并且还有一个条件,即: 这些对中的 arr [i]

示例

例如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]应该给出正确的结果。我不想继续错误的认识。

编辑

自从我了解自己做错了。而且我在代码中进行了一次编辑,该操作不以1开头的内循环,因为每次内循环完成时它均以1开头,然后再次运行。我感谢所有帮助我弄清这一点并使我的概念足够强大以解决此类问题的人。

我个人感谢Mike 'Pomax' KamermansRicolaxerx593消除了我的疑问,并给了我循环遍历元素的核心概念。将来会对我有帮助,我不再重复。 :)

5 个答案:

答案 0 :(得分:7)

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

  

查找并打印(i,j)对的数量,其中i

其中的unordered pairs个元素的数量之和可被k整除。

但是你写

  

还有另一个条件,那就是:的 arr [i]   这些对。

我好像您误解了问题。并说明了为什么i<j条件有效而arr[i] < arr[j]无效的原因。


现在,您知道只需要无序对,就无需将j1迭代到ar.length。由于您需要j > i,因此j1(包括两端)之间的每个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;
}

答案 1 :(得分:2)

当您进行i = {0 ... 10}j = {1 ... 10}时,(i和j的)约有100项强迫症,(约)有50项,其中i

  

它应该给我一个错误的答案

...它给您正确的答案! ...自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]之外。

答案 2 :(得分:1)

这是我在javaScript中的解决方案(通过了所有测试用例):

function divisibleSumPairs(n, k, ar) {
    let count=0;
    
    for(let i=0; i<n; i++){
        for(let j=0; j<n; j++){
            if(i<j){
              if((ar[i]+ar[j])%k===0) count++; 
            }
        }
    }
    return count;
}

答案 3 :(得分:0)

此解决方案使用javaScript:

  methods: {
    addNametoA() {
      this.a.push({"name":null})
    },
     CopyAtoB() {
      this.b = this.a
    }
  }

答案 4 :(得分:0)

Python 3中的解决方案(通过了所有测试用例):

itertools.combinations(arr,r)从可迭代输入中返回元素的r长度子序列。组合以字典顺序排序。因此,如果对可迭代输入进行排序,则将按排序顺序生成组合元组。

**/*
!.git/**
!node_modules/**