我的Pascal's Triangle代码存在逻辑错误,请求帮忙排查原因
Pascal三角形生成代码的问题分析
我编写了生成Pascal三角形的Java代码,当输入numRows=5时,输出结果为[[1],[1,1],[],[],[]],但预期输出应为[[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]。
错误代码
class Solution { public List<List<Integer>> generate(int numRows) { List<List<Integer>> finallist = new ArrayList<List<Integer>>(); if (numRows == 1){ List<Integer> list1 = new ArrayList<>(); list1.add(1); finallist.add(list1); return finallist; } else if (numRows == 2){ List<Integer> list1 = new ArrayList<>(); List<Integer> list2 = new ArrayList<>(); list1.add(1); list2.add(1); list2.add(1); finallist.add(list1); finallist.add(list2); return finallist; } List<Integer> list1 = new ArrayList<>(); List<Integer> list2 = new ArrayList<>(); List<Integer> alist = new ArrayList<>(); list1.add(1); list2.add(1); alist.add(1); list2.add(1); alist.add(1); finallist.add(list1); finallist.add(list2); for (int j = 3;j <= numRows;j++) { List<Integer> list3 = new ArrayList<>(); list3.add(1); for (int i = 0; i < alist.size() - 1; i++) { list3.add(alist.get(i) + alist.get(i + 1)); } list3.add(1); finallist.add(list3); alist.clear(); alist.addAll(list3); list3.clear(); } return finallist; } }
正确代码
class Solution { public List<List<Integer>> generate(int numRows) { List<List<Integer>> finallist = new ArrayList<List<Integer>>(); if (numRows == 1){ List<Integer> list1 = new ArrayList<>(); list1.add(1); finallist.add(list1); return finallist; } else if (numRows == 2){ List<Integer> list1 = new ArrayList<>(); List<Integer> list2 = new ArrayList<>(); list1.add(1); list2.add(1); list2.add(1); finallist.add(list1); finallist.add(list2); return finallist; } List<Integer> list1 = new ArrayList<>(); List<Integer> list2 = new ArrayList<>(); ArrayList<Integer> alist = new ArrayList<>(); list1.add(1); list2.add(1); alist.add(1); list2.add(1); alist.add(1); finallist.add(list1); finallist.add(list2); for (int j = 3;j <= numRows;j++) { List<Integer> list3 = new ArrayList<>(); list3.add(1); for (int i = 0; i < alist.size() - 1; i++) { list3.add(alist.get(i) + alist.get(i + 1)); } list3.add(1); finallist.add(list3); alist.clear(); alist.addAll(list3); } return finallist; } }
问题原因解析
你怀疑的list3.clear()操作确实是问题根源:
在Java中,List是引用类型。当你执行finallist.add(list3)时,finallist中存储的并不是list3的副本,而是指向list3实际对象的引用。后续调用list3.clear()会直接清空这个引用指向的集合内容,导致finallist中对应的子列表也变成空集合。
正确代码中移除了list3.clear()操作,list3的元素得以保留,finallist中的子列表自然就是正确的Pascal三角形行数据。
内容的提问来源于stack exchange,提问作者Samik Pandit
相关产品推荐
相关产品推荐

