v=[1,2,3,4,8,7,6,9]
在上面的列表中,反转6,7,8将给出连续的值。如果我理解正确,我认为这就是该问题想要找到的https://www.geeksforgeeks.org/check-reversing-sub-array-make-array-sorted/
我的方法是
查找反转值列表
查找那些列表中包含连续编号的列表。
我无法执行步骤2。这是我的代码:
v=[1,2,3,4,8,7,6,9]
ls=[]
# This part below will generate many lists and 1 of them will be [6,7,8]
for i in range (0,len(v)-1):
for j in range(i+1, len(v)):
r= v[i:j][::-1]
ls.append(r)# this append lists not values
#Below code will check to see if any list has consecutive values
for item in ls:
for i in range(len(item) - 1):
if item[i] + 1 == item[i + 1]:
if i == 0 or item[i] - 1 != item[i - 1]:
print(item)
当我期望[6,7,8]时,我得到以下信息
[6, 7, 8, 4, 3]
[7, 8, 4]
[6, 7, 8, 4]
[7, 8]
[6, 7, 8]
有人可以给我一些提示吗?我是否正确解释了原始问题?我不想将极客用于极客答案。
答案 0 :(得分:0)
您可以执行以下操作...假设连续数字表示相差一个单位的数字。您还可以更改脚本以以相反的顺序容纳数字,但不能以精确的顺序容纳数字(8 7 6)vs(9 6 4)
v=[1,2,3,4,8,7,6,9]
l = []
last_item =-99
for i in range(1,len(v)-1):
if v[i] == v[i + 1] + 1:
l.append(v[i])
last_item = v[i]
elif v[i] == last_item - 1:
l.append(v[i])
last_item = v[i]
print(sorted(l))
答案 1 :(得分:0)
如果您只想寻找一个反向的子字符串,则可以使用zip()进行连续的值对比较。首先确定第一个递减对的位置。然后从该点开始查找第一个递增对的位置。如果范围有效,请反转子字符串并测试列表是否正确。
a = [1,2,3,4,8,7,6,9]
start = next( (i for i,(v0,v1) in enumerate(zip(a,a[1:])) if v0>v1),len(a))
end = next( (i+start+1 for i,(v0,v1) in enumerate(zip(a[start:],a[start+1:])) if v0<v1),len(a))
if end > start : a[start:end] = a[start:end][::-1]
canSort = end > start+1 and not any( a>b for a,b in zip(a,a[1:])) # True
与嵌套循环的O(n ^ 2)相比,这将在O(n)时间内处理。
如果要检查多个子字符串反转,则需要将其放入循环。