Java数组两数和整除除数问题:排查未知RuntimeException原因
问题分析与修复方案
可能触发的运行时异常
- OutOfMemoryError(内存溢出):当
divisor取值接近上限1e9时,创建长度为divisor的int[] remainderCount会占用极大内存。int类型每个元素占4字节,若divisor=1e9,数组需4GB内存,远超题目1GB的内存限制,直接触发内存溢出异常。
修复方案
改用HashMap存储余数的出现次数,仅保留实际出现过的余数,避免无意义的大内存占用:
import java.util.HashMap; import java.util.Map; long solution(int[] nums, int divisor) { long result = 0; Map<Integer, Integer> remainderCount = new HashMap<>(); for (int num : nums) { int r = num % divisor; // 计算需要匹配的余数:当r=0时,target为0;否则为divisor-r int target = (divisor - r) % divisor; result += remainderCount.getOrDefault(target, 0); // 更新当前余数的计数 remainderCount.put(r, remainderCount.getOrDefault(r, 0) + 1); } return result; }
关键修改说明
- 内存优化:HashMap仅存储数组中实际出现的余数,内存复杂度从O(divisor)降至O(k)(k为不同余数的数量,最大为nums.length=1e5),完全符合内存限制。
- 逻辑简化:通过
(divisor - r) % divisor统一处理余数为0的情况,无需分支判断,逻辑更简洁且与原代码逻辑一致。
内容的提问来源于stack exchange,提问作者yarwest
相关产品推荐
相关产品推荐

