我是Ruby编程的新手,我正在尝试编写一个Ruby代码,该代码将按特定顺序获取数字列表,并将在排列列表列表中返回所有可能的排列。我不久前用Java成功编写了这个程序并且它工作正常,当我尝试在Ruby中实现相同的逻辑时,我只是获取空列表而不是排列列表。通过初始调试,我可以观察到每个排列都是通过回溯方法在temp_list列表中成功构建的,但不知何故res并没有正确地保留推送的排列。我认为Ruby中的编码风格有问题。有人可以指出问题可能是什么。我附上了我的Ruby和Java代码。
我的Ruby代码在这里:
# @param [Object] nums : List of numbers Example: [1, 2, 3]
# @return [Object] res : List of all permutation lists Example [[1, 2, 3], [1, 3, 2]....]
def permute(nums)
res = []
temp_list = []
backtrack(res, temp_list, nums)
res
end
# @param [Object] res : List of all permutation lists Example [[1, 2, 3], [1, 3, 2]....]
# @param [Object] temp_list : List of permutation which is being built
# @param [Object] nums : Original nums list given to the permute method
def backtrack(res, temp_list, nums)
if temp_list.size == nums.size
res << temp_list
else
nums.each do |n|
next if temp_list.include? n
temp_list << n
backtrack(res, temp_list, nums)
temp_list.pop
end
end
end
我的JAVA代码在这里:
import java.util.ArrayList;
import java.util.List;
/**
* Created by Srikiran Sistla on 4/3/2017.
*/
public class Q46 {
public List<List<Integer>> permute(int[] num) {
List<List<Integer>> res = new ArrayList<>();
List<Integer> tempList = new ArrayList<>();
backtrack(res, tempList, num);
return res;
}
private void backtrack(List<List<Integer>> res, List<Integer> tempList, int[] num) {
if (tempList.size() == num.length) res.add(new ArrayList<>(tempList));
else {
for (int n : num){
if (tempList.contains(n)) continue;
tempList.add(n);
backtrack(res, tempList, num);
tempList.remove(tempList.size()-1);
}
}
}
}
答案 0 :(得分:2)
很奇怪,但我解开了你的代码:)
你需要的是在将temp_list附加到res之前复制你的temp_list:
res << temp_list.dup
JFYI,你可以通过调用标准的数组#置换来节省一些时间:
[1,2,3].permutation.to_a # => [[1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1], [3, 1, 2], [3, 2, 1]]