虽然看到这个问题会很奇怪,但在我继续编码的过程中,我真的需要了解一些核心概念。我有一个关于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' Kamermans,Ricola和xerx593清除我的疑虑,并给我循环元素的核心概念。它将来会对我有所帮助,我不会再重复那件事了。 :)
我刚检查了你的链接,问题陈述中给出的条件是
查找并打印(i,j)对的数量,其中i <j和ar [i] + ar [j]可被k整除。
这只是元素的unordered pairs数,其总和可被k整除。
不过你写的
还有一个条件,即:来自这些对的arr [i] <arr [j]。
我好像你误解了这个问题。它解释了为什么i<j
条件有效,而arr[i] < arr[j]
没有。
既然你知道你只需要无序对,就不需要将j
从1
迭代到ar.length
。既然你需要j > i
,j
和1
(包括)之间的每个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;
}
温你做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 > j
或j < i
(但不是两者),几乎是正确的:除了a[i] == a[j]
。
这个解决方案是使用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
}