如何减少循环次数或复杂性

时间:2017-10-09 09:58:26

标签: python python-2.7 optimization

所以我要做的是找到交替数字的计数,使其与-ve和正号交替 例如:1 -2 3 -4会得到4 3 2 1从1到-4,包括两个数字,有4个数字。 Simillarly为1 1 -3 2会得到1 3 2 1 现在我有了代码,但我无法对其进行优化,并且即使它适用于中等输入流,也会返回超出时间限制的错误。

j=0
count=0
length=(raw_input())
st=map(int,raw_input().split())
while j+1 < len(st):
     k=j+1
     count=0
     temp=j
     while k<len(st) and ((st[k]<0 and st[j]>0) or (st[k]>0 and st[j]<0)):
       count+=1
       k+=1
       j+=1
     print count+1,
     j=temp+1
print 1

1 个答案:

答案 0 :(得分:0)

尝试使用for循环而不是while循环,因为这样可以避免一些变量赋值:

st = map(int, raw_input().split())
length = len(st)-1
for i in range(length):
    count = 1
    for j in range(i, length):
        if (st[j]<0 and st[j+1]>0) or (st[j+1]<0 and st[j]>0):
            count += 1
        else:
            break
    print(count)
print(1)

这将给出:

<< 1 -2 3 4
>> 4
>> 3
>> 2
>> 1

<< 1 1 -3 2
>> 1
>> 3
>> 2
>> 1

如果从列表中提取一次而不是两次,也可能会更快一些:

st = map(int, raw_input().split())
length = len(st)-1
for i in range(length):
    count = 1
    for j in range(i, length):
        first, second = st[j:j+2]
        if (first<0 and second>0) or (first>0 and second<0):
            count += 1
        else:
            break
    print(count)
print(1)

我要尝试的最后一件事是检查他们的sig与单个comparisson不同但我真的不希望它更快:

st = map(int, raw_input().split())
length = len(st)-1
for i in range(length):
    count = 1
    for j in range(i, length):
        product = st[j] * st[j+1]
        if product != abs(product):
            count += 1
        else:
            break
    print(count)
print(1)