看不太懂,先留着
可除数和对 | HackerRank --- Divisible Sum Pairs | HackerRank
给定一个整数数组和一个正整数k ,求(i,j) 对中i<j和ar[i] +ar[j] 能被k整除的个数。
function divisibleSumPairs(n: number, k: number, ar: number[]): number {
// Write your code here
let count = 0;
const remainderCount = new Array(k).fill(0);
for (let i = 0; i < n; i++) {
const remainder = ar[i] % k;
const neededRemainder = (k - remainder) % k;
count += remainderCount[neededRemainder];
remainderCount[remainder]++;
}
return count;
}
count
: 用于记录满足条件的数对的数量,初始值设为0
。remainderCount
: 用于存储余数的出现次数。长度为k
的数组,初始时所有值为0
。其目的在于记录每个余数(0 到 k-1)的出现次数,方便后续查找。const remainder = ar[i] % k;
计算当前元素ar[i]
对k
的余数,这样可以确定这个数在模k
的情况下的分类。const neededRemainder = (k - remainder) % k;
通过上面的公式,我们可以确定要与当前数
ar[i]
配对的另一个数的余数:如果
remainder
是0
,neededRemainder
也是0
,这意味着另一个数也应该是0
(即ar[j]
的余数为0
)。如果
remainder
是1
且k
是5
,则neededRemainder
是4
,这意味着要找的另一个数的余数应该是4
,以使得它们的和(即1 + 4
)能够被5
整除。更新
count
:count += remainderCount[neededRemainder]
:这一步的作用是,如果当前数的余数为remainder
,我们通过查找remainderCount
数组来获取之前有多少个数的余数是neededRemainder
。这些数可以和当前数成对,从而构成符合条件的和。
更新
remainderCount
:remainderCount[remainder]++
:这行代码是将当前数的余数remainder
的计数加1
,因为我们在处理完当前数后,希望将它也加入到余数的计数中,供后续的元素使用。