作为技术面试的准备,我正在为此特定目的的平台上练习 Java 问题。该平台有许多可见或隐藏的测试用例,我的解决方案通过了所有测试用例,除了五个隐藏用例中的两个之外。执行这些情况时,平台指示“发生运行时异常”,但不提供没有其他信息。
我的问题是:您可以在我的代码中发现哪些可能的运行时异常?
我遇到的问题大致如下:
给定一个(可能非唯一的)正整数
nums
列表和一个正整数 divisor
,找到两个不同索引 i < j
的组合数,使得 nums[i] + nums[j]
可以被 divisor
整除。
额外限制:
1 ≤ nums.length ≤ 10^5
1 ≤ nums[i] ≤ 10^9
1 ≤ divisor ≤ 10^9
Memory usage: 1GB
Runtime: 3 minutes
我创建了以下解决方案来最大程度地减少运行时间:
long solution(int[] nums, int divisor) {
long result = 0;
int[] remainderCount = new int[divisor];
Arrays.fill(remainderCount, 0);
for(int i = 0; i < nums.length; i++) {
int r = nums[i] % divisor;
if(r > 0) {
result += remainderCount[divisor - r];
} else {
result += remainderCount[0];
}
remainderCount[r] += 1;
}
return result;
}
总而言之,我试图弄清楚我的代码可能会出现哪些问题,以及如何预防它们或优化解决方案以不包含这些陷阱?
我花了一些时间尝试通过根据约束创建输入数据来重现错误,但是程序从未遇到问题。我还研究了一些
RuntimeException
,例如:
ArithmeticException
、NullPointerException
、ClassCastException
、ArrayIndexOutOfBoundsException
、NegativeArraySizeException
、ArrayStoreException
、UnsupportedOperationException
、NoSuchElementException
)但对我来说,考虑到输入的限制,它们似乎都不太可能。我无法理解这一点,所以非常欢迎任何和所有的指点!预先感谢:))
如果
nums
是 null
,您将获得 NullPointerException
。
如果
divisor
小于零,您将得到 NegativeArraySizeException
。
如果
divisor
为零,您可能会认为 nums[i] % divisor
会给出 ArithmeticException
。然而,仔细检查发现,如果 divisor
为零,则不会执行循环体。
...我怎样才能防止它们或优化解决方案以不包含这些陷阱?
这些可以通过简单的测试来预防。但是,尚不清楚您是否“应该”防止异常。在这两种情况下,都是由于调用者违反了输入约束。 也有可能还有其他问题,但我还没发现……