[英]What's the difference between the two of the codes?
第二个显示 IndexError: deque index out of range 而另一个完美运行,有人可以解释一下吗? 输出只能是“是”或“否”。
from collections import deque
def check(d):
while d:
big = d.popleft() if d[0]>d[-1] else d.pop()
if not d:
return "Yes"
if d[-1]>big or d[0]>big:
return "No"
for i in range(int(input())):
int(input())
d = deque(map(int,input().split()))
print(check(d))
from collections import deque
for i in range(int(input())):
int(input())
numbers = list(map(int, input().split()))
d = deque(numbers)
n = len(numbers)
while d:
if d[0]>d[-1]:
previous = d.popleft()
else:
previous = d.pop()
if not d:
answer = "Yes"
if d[-1]>previous or d[0]>previous:
answer = "No"
print(answer)
样本输入:
2
6
4 3 2 1 3 4
3
1 3 2
在您的第一个程序中:
while d:
big = d.popleft() if d[0]>d[-1] else d.pop()
if not d:
return "Yes"
if d[-1]>big or d[0]>big:
return "No"
当双端队列为空或第一个或最后一个元素大于刚刚弹出的元素时, return
将退出循环。
但是在你的第二个程序中:
while d:
if d[0]>d[-1]:
previous = d.popleft()
else:
previous = d.pop()
if not d:
answer = "Yes"
if d[-1]>previous or d[0]>previous:
answer = "No"
在双端队列为空之前不会退出循环,但是您希望在确定answer
的值后立即退出,就像您的第一个程序一样。 因此,在设置answer
后需要break
一下。
您看到的错误消息是由于以下原因:总是执行第二个和第三个if
语句。 如果d
为空,则当第三个if
语句尝试访问第一个和最后一个元素时会出现范围错误。 上一段中的修复 - 在answer = "Yes"
之后添加break
- 也将修复此错误,但通过将第三个if
更改为elif
来明确意图并没有什么坏处,因此它仅在d
非空时执行.
最后, print(answer)
应该在循环之外,而不是在循环内部。
这是第二个程序的固定版本:
from collections import deque
for i in range(int(input())):
int(input())
numbers = list(map(int, input().split()))
d = deque(numbers)
n = len(numbers)
while d:
if d[0]>d[-1]:
previous = d.popleft()
else:
previous = d.pop()
if not d:
answer = "Yes"
break
elif d[-1]>previous or d[0]>previous:
answer = "No"
break
print(answer)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.