作为技术采访的准备,我在一个平台上练习Java问题,以达到这个特定目的.该平台有许多可见或隐藏的测试用例,我的解决方案通过了除五个隐藏用例中的两个以外的所有测试用例.在执行这些 case 时,平台会指出"已发生运行时异常",但提供了no additional information个.

我的问题是:what possible runtime exceptions can you spot in my code?

问题陈述

我得到的问题大致如下:

给定正整数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,例如: ArithmeticExceptionNullPointerExceptionClassCastExceptionArrayIndexOutOfBoundsExceptionNegativeArraySizeExceptionArrayStoreExceptionUnsupportedOperationExceptionNoSuchElementException但在我看来,考虑到输入的限制,它们都不太可能.我不能理解这一点,所以任何和所有的指针是非常欢迎的!Thanks in advance:)

推荐答案

如果numsnull,你会得到NullPointerException.

如果divisor小于零,你会得到NegativeArraySizeException分.

如果divisor是零,你可能会认为nums[i] % divisor等于ArithmeticException.然而,更仔细的判断表明,如果divisor为零,则不会执行循环体.


...我如何才能防止它们或优化解决方案以不包括这些trap ?

这些都可以通过简单的测试来预防.然而,目前还不清楚您是否能够阻止这些例外.在这两种情况下,它们都是由于调用方违反了输入约束.

也有可能还有其他问题,但我还没有发现它们……

UPDATE

当除数为10^9时,new int[divisor]分配4x10^9字节.这比1 GB大得多.因此,OutOfMemoryError是第三种可能性.

Java相关问答推荐

try Dockerize Maven应用程序,但发布版本21不支持"

CriteriaQuery with max

如何在SystemiccationRetryListenerSupport中获得类级别的spring retryable annotation中指定的标签?

Java WireMock定义存根在Cucumber并行执行的多线程测试中失败

在现代操作系统/硬件上按块访问数据值得吗?

如何在Java中声明未使用的变量?

从技术上讲,OPC UA客户端是否可以通过转发代理将请求通过 tunel 发送到OPC UA服务器?

Java中的死锁及其重入锁和锁

对于亚洲/香港,使用ResolverStyle.STRICT的LocalDate.parse返回意外结果

格式中的特定回录键-值对

将Spring Boot 3.2.0升级到3.2.1后查询执行错误

使用for循环时出现堆栈溢出错误,但如果使用if块执行相同的操作,则不会产生错误

每次我需要时创建和关闭数据库连接会有什么效果吗?

如何在运行docker的应用程序中获取指定的配置文件

如何在ApacheHttpClient 5中为单个请求设置代理?

本机方法(JNI)总是编译的吗?

Java中的发布/订阅-Long Live和Short Live Publisher,哪种方法是正确的?

JPA无手术同品种器械可能吗?

Java 21保护模式的穷尽性

Maven创建带有特定类的Spring Boot jar和普通jar