gpt4 book ai didi

java - 数组列表、列表

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:12:21 25 4
gpt4 key购买 nike

当我试图解决子集问题时,我写了这样的代码:

    public class Subsets {
public List<List<Integer>> subsets(int[] nums) {
List<List<Integer>> list = new ArrayList<>();
Arrays.sort(nums);
backtrack(list, new ArrayList<>(), nums, 0);
return list;
}
public void backtrack(List<List<Integer>> list, ArrayList<Integer>temp, int[] nums, int start){
list.add(temp);
for(int i = start; i<nums.length;i++){
temp.add(nums[i]);
backtrack(list, temp, nums, i++);
temp.remove(temp.size()-1);
}
}
}

输出是

[[],[],[],[],[],[],[],[]]

但正确答案应该是

[[3],[1],[2],[1,2,3],[1,3],[2,3],[1,2],[]]

当我像那样更改“回溯”代码时,答案是正确的:

public void backtrack(List<List<Integer>> list, List<Integer> temp, int[] nums, int start){
list.add(new ArrayList(temp));
for(int i = start; i<nums.length;i++){
temp.add(nums[i]);
backtrack(list, temp, nums, i+1);
temp.remove(temp.size()-1);
}
}

我的问题:为什么我需要这样写代码:

    public void backtrack(List<List<Integer>> list, List<Integer> temp, int[] nums, int start){
list.add(new ArrayList(temp));

而不是:

    public void backtrack(List<List<Integer>> list, ArrayList<Integer> temp, int[] nums, int start){
list.add(temp);

最佳答案

这里:

list.add(new ArrayList(temp));

创建一个 List 对象,在这个时间点包含temp 的内容。

鉴于

list.add(temp);

只是将对现有 temp 列表的引用添加到 list

因此,在第二种情况下,当您稍后修改 temp 时,也会影响 list 的内容。

但除此之外:您的代码本应更难阅读/理解。对该方法使用 temp 参数没有意义。例如,您可以使 temp 成为方法内的局部变量。无论如何,传入列表都是。将其作为输入参数不会获得任何好处;你只会增加困惑。

然后你改进你的命名 - 因为 listtemp 真的没有告诉读者这些变量的意图用途是。

关于java - 数组列表、列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42440386/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com