- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在定义一个执行贪婪排序的 Python 函数。
(生物信息学算法 I,2014 年,Coursera - Stepic 6.4)
排序的结果应该是 [+1, +2, +3, +4, +5] 并且函数也应该返回初始输入列表的所有变化步骤。
要对初始输入列表进行排序,几个反转步骤是必不可少的。它很像 pancake flipping problem .本题将有符号排列([-3,+4,+1,+5,-2])改为恒等有符号排列([+1,+2,+3,+4,+5])。
示例输入:
[-3, +4, +1, +5, -2]
示例输出:
[[-1, -4, +3, +5, -2],
[+1, -4, +3, +5, -2], # -1 -> +1
[+1, +2, -5, -3, +4], # reversal of (-4, +3, +5, -2)
[+1, +2, +3, +5, +4], # reversal of (-5, -3)
[+1, +2, +3, -4, -5], # reversal of (+5, +4)
[+1, +2, +3, +4, -5], # -4 -> +4
[+1, +2, +3, +4, +5]] # -5 -> +5 Sorting finished!
我写了一个函数,但它的结果不正确。
# Implementation
def reversing(seq):
"""
>>> reversing([+1,+2,-3,-4])
[+4,+3,-2,-1]
"""
seq.reverse()
seq = map(lambda(x): -x, seq)
return seq
def greedySorting1(lst):
"""
ApproxReversalDistance (ARD)
Return a number (ARD) until the result is [1,2,...,n]
>>> greedySorting1([1,-5,3,-2,-4])
6
"""
change = []
ARD = 0
for i in range(len(lst)):
if lst[i] != i+1:
if i+1 in lst:
id_i = lst.index(abs(i+1))
else:
id_i = lst.index(-abs(i+1))
lst = lst[:i] + reversing(lst[i:id_i+1]) + lst[id_i+1:]
ARD += 1
change.append(lst)
if lst[i] == -(i+1):
lst[i] = i+1
ARD += 1
change.append(lst)
return change
# Testing
print greedySorting([-3,+4,+1,+5,-2])
[[+1, -4, +3, +5, -2], # Wrong: +1 should be -1
[+1, -4, +3, +5, -2],
[+1, +2, -5, -3, +4],
[+1, +2, +3, +5, +4],
[+1, +2, +3, +4, -5], # Wrong: +4 should be -4
[+1, +2, +3, +4, -5],
[+1, +2, +3, +4, +5]]
如何修复我的代码以获得正确的答案,例如示例输出?
谢谢。
最佳答案
此处您正在就地修改 lst
,因此在 change
中对它的任何引用都将反射(reflect)相同的更改
if lst[i] == -(i+1):
您可以通过使用 lst[:]
制作副本来确保“解耦”change
中的列表
for i in range(len(lst)):
if lst[i] != i+1:
if i+1 in lst:
id_i = lst.index(abs(i+1))
else:
id_i = lst.index(-abs(i+1))
lst = lst[:i] + reversing(lst[i:id_i+1]) + lst[id_i+1:]
ARD += 1
change.append(lst[:])
if lst[i] == -(i+1):
lst[i] = i+1
change.append(lst[:])
现在你也可以简化这一行:
lst = lst[:i] + reversing(lst[i:id_i+1]) + lst[id_i+1:]
到
lst[i: id_i + 1] = reversing(lst[i: id_i + 1])
关于python - python中的贪心排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28059215/
>>> import re >>> p = re.compile('.*&l=(.*)(&|$)') >>> p.search('foo&l=something here&bleh').group(1
最近有一道面试题如下:我们得到了一个单词列表,我们想要格式化它们以最大化回车符的数量,同时将每行的字母数量保持在一个范围内。 例如,我们希望每行的字母范围为 5 - 10(含),一种解决方案是: he
我正在使用二维数组来处理游戏中的对象。数组的维度就像笛卡尔网格上的坐标。当玩家选择一个点时,我想从数组中收集 N 个最近的网格单元,即使该点不是有效的数组索引。 例子:从 [0,0] 到 [10,10
我在 Hibernate 之上使用 Olingo 1.2。 我有一个返回 250 行的请求,每行以一对多关系链接到另一个表。 我执行 $expand 以获取子表中的所有数据,但是当我检查在数据库中执行
我正在 ANTLR4 中构建语法,但收到此警告 TL4.g4:224:12: greedy block ()* contains wildcard;非贪婪语法 ()*?可能是首选 这是它引用的代码行
In the default greedy mode, all data offered to targets are accepted, even if the other target doesn
假设我有 n 个盒子,每个盒子里面都有一些值 b[i] .我可以保证对一组框进行排序,使得 b[1] j; { min_{k=i}^j (c[k] + max(T(i, k-1)
本文已收录到 AndroidFamily ,技术和职场问题,请关注公众号 [彭旭锐] 提问。 大家好,我是小彭。 上周末是 LeetCode 第 339 场周赛,你参加
什么是 PHP 中的“贪心 token 解析”?我在 Codeigniter 指南中找到了这个: “除非需要解析变量,否则始终使用单引号字符串,并且在确实需要解析变量的情况下,使用大括号防止贪婪的标记
本文已收录到 AndroidFamily ,技术和职场问题,请关注公众号 [彭旭锐] 提问。 大家好,我是小彭。 上周末是 LeetCode 第 337 场周赛,你参加
我是一名优秀的程序员,十分优秀!