获取IndexError:字符串索引超出范围

时间:2016-10-29 11:48:59

标签: python python-3.x python-2.x

给定base- 10 整数, n ,将其转换为二进制(base-2)。然后找到并打印基数为10的整数,表示 n 的二进制表示中连续1的最大数量。 这是我为它写的代码

#!/bin/python
import sys
k=0
m=0
i=0
n = int(raw_input().strip())
x=bin(n)[2:]
while x[i] :
    if x[i]==1:
        m=m+1
    else :
        if k<m:
            k=m
            m=0
    i+=1
print(k)

我收到以下错误

Traceback (most recent call last):
File "solution.py", line 9, in <module>
while x[i] :
 IndexError: string index out of range

2 个答案:

答案 0 :(得分:1)

你的while循环递增i但从不检查它何时超过字符串x的结尾。您的测试while x[i]不会检查字符串的结尾,只检查每个字符是否为空。由于字符串中的字符不为空(并且您的字符串仅包含'0''1'),因此您的循环将继续。请注意,字符串'0'不会测试False:它是一个完全有效的字符串,其评估结果为True

如果您需要该结构,请使用检查

while i < len(x):

但重构代码并使用

会更加pythonic
for c in x:

查看字符串c中的每个字符x

答案 1 :(得分:0)

您的条件while x[i]错误,因为它永远不会评估False任何字符。你习惯了C的以空字符结尾的字符串吗?

此外,您要将strint进行比较:

if x[i]==1:

执行此操作的正确方法是使用for-each循环:

import sys

k = 0
m = 0
i = 0

n = int(raw_input().strip())
x = bin(n)[2:]

for c in x:
    if c == '1':
        m += 1
    else:
        if k < m:
            k = m
        m = 0

# check whether the last run is greater than the current maximum
if k < m:
    k = m

print(k)