给定一个包含 N 个整数的数组 A。 返回一个由数组所有子数组组成的二维数组
我曾尝试按照循环获取 temp 中的子数组,并将该子数组直接添加到 ans(2d arraylist)
public ArrayList<ArrayList<Integer>> solve(ArrayList<Integer> A) {
int n=A.size();
ArrayList<ArrayList<Integer>> ans= new ArrayList<>();
for(int i=0;i<n;i++)
{
ArrayList<Integer> temp=new ArrayList<>();
for(int j=i;j<n;j++)
{
temp.add(A.get(j));
ans.add(temp);
}
}
return ans;
}```
INPUT= [1,2,3,4,5]
Getting Output= [1 2 3 4 5 ] [1 2 3 4 5 ] [1 2 3 4 5 ] [1 2 3 4 5 ] [1 2 3 4 5 ] [2 3 4 5 ] [2 3 4 5 ] [2 3 4 5 ] [2 3 4 5 ] [3 4 5 ] [3 4 5 ] [3 4 5 ] [4 5 ] [4 5 ] [5 ]
Expected Output= [[1],[1,2],[1,2,3],[1,2,3,4],[1,2,3,4,5],[2],[2,3],[2,3,4],[2,3,4,5],[3],[3,4],[3,4,5],[4],[4,5],[5]]
问题是您将相同的
ArrayList
对象 (temp
) 多次添加到 ans
。在 Java 中, ArrayList
对象是可变的。因此,当您修改 temp
时,ans
中对它的所有引用也会更新。
要修复此问题,请先从
temp
创建一个新列表,然后再将其添加到 ans
,例如,使用 new ArrayList<>(temp)
:
import java.util.ArrayList;
import java.util.Arrays;
class Main {
public static void main(String[] args) {
ArrayList<Integer> input = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5));
System.out.println(solve(input));
}
public static ArrayList<ArrayList<Integer>> solve(ArrayList<Integer> A) {
int n = A.size();
ArrayList<ArrayList<Integer>> ans = new ArrayList<>();
for (int i = 0; i < n; i++) {
ArrayList<Integer> temp = new ArrayList<>();
for (int j = i; j < n; j++) {
temp.add(A.get(j));
ans.add(new ArrayList<>(temp));
}
}
return ans;
}
}
输出:
[[1], [1, 2], [1, 2, 3], [1, 2, 3, 4], [1, 2, 3, 4, 5], [2], [2, 3], [2, 3, 4], [2, 3, 4, 5], [3], [3, 4], [3, 4, 5], [4], [4, 5], [5]]