LeetCode 118杨辉三角代码输出错误原因咨询
杨辉三角代码异常输出原因
Java中所有对象类型的变量都是引用,存储的是对象在堆内存中的地址,而非对象本身的数据,这是你代码出现错误的核心原因。
你代码的执行逻辑问题如下:
- 你在循环外仅初始化了一次
row对象,全程所有操作都是修改这同一个堆内存中的对象内容 - 直接调用
result.add(row)时,只是把row的引用地址复制了一份存入result,并不会复制row里的实际数据 - 循环结束后,
row的最终内容是[1,4,6,4,1],此时遍历result时,所有位置存的引用都指向这同一个最终状态的对象,所以输出全是相同的最后一行
new ArrayList(row)是调用ArrayList的拷贝构造方法,会新开辟一块堆内存创建一个独立的ArrayList实例,把当前row里的所有元素复制到新实例中。此时你再把新实例的引用存入result,后续对原row的修改就不会影响已经存入result的内容,每一轮存入的都是当前轮次的杨辉三角行快照,结果就符合预期。
修正后的完整代码如下:
class Solution { public List<List<Integer>> generate(int numRows) { List<List<Integer>> result = new ArrayList(); List<Integer> row = new ArrayList(); for(int i = 0; i < numRows; i++ ){ row.add(0,1); for(int j = 1; j < row.size()-1; j++){ row.set(j, row.get(j) + row.get(j+1)); } // 正确写法:存入当前row的拷贝 result.add(new ArrayList(row)); } return result; } }
内容的提问来源于stack exchange,提问作者Binky
相关产品推荐
相关产品推荐

