为了账号安全,请及时绑定邮箱和手机立即绑定

检查反转子数组是否使数组排序-Python

检查反转子数组是否使数组排序-Python

肥皂起泡泡 2022-01-11 20:30:27
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 valuesfor 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]有人可以给我一些提示吗?我是否正确解释了原始问题?我不想用极客来回答极客。
查看完整描述

2 回答

?
HUH函数

TA贡献1836条经验 获得超4个赞

如果您只寻找要反转的单个子字符串,则可以使用 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) 时间内处理,而不是嵌套循环的 O(n^2)。


如果要检查多个子字符串反转,则需要将其变为循环。


查看完整回答
反对 回复 2022-01-11
?
qq_花开花谢_0

TA贡献1835条经验 获得超7个赞

你可以做这样的事情......假设连续数字是指相差一个单位的数字。您还可以更改脚本以以相反的顺序容纳数字,但不是精确的顺序 (8 7 6) 与 (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))


查看完整回答
反对 回复 2022-01-11
  • 2 回答
  • 0 关注
  • 170 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号