注:本问题仅限于JAVA。
问题起因
一道很经典的dfs问题,需要求得某个组合的总数,于是我设置了一个static全局变量(下称为num),并设置其初始值为0,后续满足对应的组合条件,就对该变量进行更新。
然后在提交代码的时候,遇到了非常诡异的问题。某个测试用例,在leetcode自带的测试上和本地IDEA上运行均正确,但是提交后却显示错误。
问题排查
本地和测试框都没问题,说明算法本身肯定是没有问题的,问题初步猜测在这个全局变量上。
因为刚看过java的累加载,考虑是不是累加载的问题。
上网搜索后,发现很多人也有类似问题,是因为:leetcode在输入测试用例的时候,只加载了一次Solution类。
详细如下:leetcode端测试时,应该有一个Main类,其中有很多测试用例,然后调用Solution对象的该方法,对全局变量进行更新。Solution对象的创建过程为:首先进行Solution类的加载,num的加载和赋值发生在这一步,加载后的变量存放于堆中。接着进行Solution对应对象的创建,执行每个测试用例的时候,通过栈中的方法对堆中的num进行更新。可以看到,从始至终,num只有一个。
注: 类加载过程可见juejin.cn/post/709296…
回顾我们的代码,我们有以下两个操作:
1.定义static变量,并对其进行了初始化赋值。
2.后续满足一定条件,才会对该值进行更新。
那么,当我们在运行第10个测试用例时,没有更新num,由于其全局特性,其实num的值是第9个测试用例的结果(如何第9个更新了的话)。
后续将初始化赋值操作放在了方法体内,使得每次跑测试用例的时候都对num进行更新,成功解决了上诉问题。
总结
static变量的全局性导致了Leetcode提交结果与测试用例(同本地测试)运行结果不一致的问题,解决方法是破坏上诉两操作之一即可:
1.不用static变量。
2.每次对static变量进行更新。