如何从数组中获取和为3的倍数的正确数对?
解决数组中找和为3的倍数的不重复数对问题
你的问题出在重复计数——大概率是代码里没限制数对的唯一性,把(i,j)和(j,i)当成两个不同数对统计了,或者没排除同一元素重复使用的情况。下面给两种正确的实现逻辑:
方法一:数学组合法(高效)
先把数组元素按模3的余数分成三类:余0、余1、余2。符合条件的数对只有两种情况:
- 两个余0的元素相加(0+0=0,是3的倍数)
- 一个余1和一个余2的元素相加(1+2=3,是3的倍数)
直接通过组合数计算总数,不用遍历所有数对,效率更高:
const arr = [1, 3, 2, 6, 1, 2]; let count0 = 0, count1 = 0, count2 = 0; // 统计各类余数的元素数量 for (const num of arr) { const mod = num % 3; if (mod === 0) count0++; else if (mod === 1) count1++; else count2++; } // 计算符合条件的数对总数 const total = (count0 * (count0 - 1)) / 2 + count1 * count2; console.log(total); // 输出5
方法二:遍历验证法(直观)
如果需要看到具体的数对,可以用双重循环,限制内层循环从外层索引的下一位开始,确保每个数对只被统计一次:
const arr = [1, 3, 2, 6, 1, 2]; let count = 0; for (let i = 0; i < arr.length; i++) { // j从i+1开始,避免重复统计(i,j)和(j,i) for (let j = i + 1; j < arr.length; j++) { if ((arr[i] + arr[j]) % 3 === 0) { count++; console.log(`符合条件的数对:(${arr[i]}, ${arr[j]})`); } } } console.log('总数:', count); // 输出5
两种方法都能得到预期的5个数对,其中遍历法打印的具体数对是:
- (1,2)、(1,6)、(3,6)、(1,2)、(1,2)
内容的提问来源于stack exchange,提问作者user2024080
相关产品推荐
相关产品推荐

