n = int(raw_input())
s = raw_input().strip().split(' ')
ar = index = [0]*n; done = [False]*n
for a in range(n): ar[a] = int(s[a])
k=0
for a in range(5):
m = 1000000001
for i in range(n):
if done[i]: continue
if ar[i] < m: m = ar[i]
if m == 1000000001:
sys.stdout.write('-1\n')
break
#print m
for i in range(n):
if ar[i] == m:
index[k] = i
k+=1
done[i]=True
print index
算法很简单。 ar 是 n (>= 5) 个整数的数组。我打算将数组的前 5 个最小整数的基于 0 的位置存储在 index 中。
将n作为输入后,在下一行输入n个空格分隔的整数。
问题很奇怪 - 对于以下输入:
7
6 17 5 3 13 8 10
当我在代码中取消注释 #print m 时,它会打印 3 3 0 3 0(预期输出为 3 5 6 8 10 );此外,还会发生 IndexError(这只是实际问题的症状)。
变量 done 按预期工作(它包含一个 bool 值列表,其中,如果 done[i] 为 True,则寻找 min(ar)
ar[i]
我通过在不同位置打印变量值进行了大量调试,但无法推理出任何东西。
请您参考如下方法:
我并没有真正遵循你的代码,但是这个:
ar = index = [0]*n
在 python 中做起来似乎很奇怪,尝试将其替换为:
ar = [0]*n
index = [0]*n
看看它是否有效。
这个例子可能有助于理解为什么这看起来很奇怪:
>>> a = b = [0] * 5
>>> a
[0, 0, 0, 0, 0]
>>> b
[0, 0, 0, 0, 0]
>>> a[1] = 2
>>> a
[0, 2, 0, 0, 0]
>>> b
[0, 2, 0, 0, 0]
您可能有兴趣查看 Other languages have "variables", Python has "names" .
旁注:
尽量让你的代码更具可读性:
- 需要时换行,实际上不需要
; - 不要在一行中写 for-loops/if-statements:有列表理解。
另外(如果我明白你想做什么),你的代码可以重写为:
s = raw_input().strip().split(' ')
ar = [(int(num),i) for i,num in enumerate(s)]
ar.sort()
print [a[1] for a in ar[:5]]
