https://www.ksp.sk/ulohy/zadania/1238/问题链接(斯洛伐克语)
最简单的英文翻译:第一个名为signlist的变量是未定义数字“<”的输入和“>”符号。名为n的第2个是signlist + 1的长度,因为它是在这些符号之间的数字量(例如2> 1< 3,signlist有2个符号,n是3,数字是范围的列表1-n + 1排他性)。
我应该打印出符号的正确数字顺序(例如输入>>>的4 3 2 1。)
我的代码有效,但根据网站的说法很慢。
注释掉的是第一个基于列表复杂性的版本。
#combinations(ofwhat,howmanychars)
from itertools import permutations
signlist = [l for z in input() for l in z]
n = len(signlist)+1
ListOfCorrect = [i for i in permutations(range(1,n+1),n) if eval(("{}".join(str(y) for y in i)).format(*signlist))]
print(*ListOfCorrect[0],sep = " ")
#for i in permutations(range(1,n+1),n):
# forstring1 = ("{}".join(str(y) for y in i)).format(*signlist)
# if eval(forstring1):
# print(" ".join(str(y) for y in i))
# break
#x = list(permutations(range(1,n+1),n))
答案 0 :(得分:0)
我怀疑你最可控制的减速来源正在建立这么大的名单。相反,单独进行排列。按顺序处理每个表达式(当 N 很大时,应节省时间);或者,生成所有表达式的列表,并使用全部缩减来点击它们。
对于大型列表而言,更好的方法是获取数字1-n列表和运算符列表。在每个级别,将列表拆分为该运营商的合法和非法未使用的号码。重申法律清单的每个要素。
例如,我们假设您已经使用[2,3,4,7,8]和当前字符串“5<>><>”进行了调用。您现在只需要接受数字 x ,以便 5< X 即可。你拿左边的部分,然后重复2,3和4中的每一部分。第一个看起来像:
public void fooMethod2() {
/*myTreeView is also an insance variable*/
myTreeView = new TreeView<String>();
CheckBoxTreeItem<String> root = new CheckBoxTreeItem<>();
CheckBoxTreeItem<String> branch1 = new CheckBoxTreeItem<>("Branch 1");
CheckBoxTreeItem<String> branch2 = new CheckBoxTreeItem<>("Branch 2");
CheckBoxTreeItem<String> branch3 = new CheckBoxTreeItem<>("Branch 3");
root.getChildren.add(branch1);
root.getChildren.add(branch2);
root.getChildren.add(branch3);
myTreeView.setCellFactory(CheckBoxTreeCell.forTreeView());
myTreeView.setRoot(root);
myTreeView.setShowRoot(false);
myTreeView.setEditable(true);
}
这会失败;下一个是
place_nums( [3, 4, 7, 8], "2>><>" )
看看它是如何工作的?平均而言,您将在每个级别重复使用一半元素,并在必须生成所有排列之前修剪死角。
这是否足以让你在递归算法上取得进展?