在整数列表中查找对时出现无法解释的运行时错误,其总和可被第三个整数整除

问题描述 投票:0回答:1

作为技术面试的准备,我正在为此特定目的的平台上练习 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
)但对我来说,考虑到输入的限制,它们似乎都不太可能。我无法理解这一点,所以非常欢迎任何和所有的指点!预先感谢:))

java algorithm runtime-error
1个回答
1
投票

如果

nums
null
,您将获得
NullPointerException

如果

divisor
小于零,您将得到
NegativeArraySizeException

如果

divisor
为零,您可能会认为
nums[i] % divisor
会给出
ArithmeticException
。然而,仔细检查发现,如果
divisor
为零,则不会执行循环体。


...我怎样才能防止它们或优化解决方案以不包含这些陷阱?

这些可以通过简单的测试来预防。但是,尚不清楚您是否“应该”防止异常。在这两种情况下,都是由于调用者违反了输入约束。 也有可能还有其他问题,但我还没发现……

© www.soinside.com 2019 - 2024. All rights reserved.