2017-10-09 3 views
-1

Also was ich versuche zu tun ist, finden Sie die Anzahl der alternierenden Zahlen, so dass es mit -ve und positives Vorzeichen für zB 1 -2 3 -4 würde mich bekommen 4 3 2 1 wie von 1 bis -4 einschließlich der beiden Zahlen gibt es 4 Nummern. Simillarly für 1 1 -3 2 würde mir 1 3 2 1 Jetzt habe ich den Code, aber ich kann es nicht optimieren und es gibt mir ein Zeitlimit überschritten Fehler, obwohl es für moderate Eingabe Stream funktioniert.Wie reduziere ich die Anzahl der Schleifen oder Komplexität

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

Ihre Frage ist Wegthema. Aber Sie können es vielleicht versuchen bei [code review] (https://codereview.stackexchange.com/) –

+0

Wenn Sie die Anzahl der verschiedenen Zahlen erhalten möchten, dann fügen Sie einfach alle zu einem Satz und erhalten Sie die festgelegte Länge –

+4

Dies gehört zu https : //codereview.stackexchange.com – Torxed

Antwort

0

Try for-Schleifen anstelle von while-Schleifen wie vermeidet man einige Variablenzuweisungen:

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) 

Dies gibt:

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

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

Es kann auch ein bisschen schneller sein, wenn Sie extrahiere die Nummern aus der Liste einmal statt zweimal:

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) 

Das letzte, was ich versuchen würde, ist die Überprüfung, dass sie sigs mit einem einzigen comparisson unterschiedlich sind, aber ich erwarte nicht wirklich diese schneller sein:

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) 
+0

Ich nahm 'len (st) - 1' aus der Schleife, so dass es nur einmal berechnet werden muss – Adirio

+0

Danke @Adirio .Noch die Komplexität ist nicht reduziert.Haben Sie eine andere Vorgehensweise. –

+0

Ich habe einige Optionen hinzugefügt, aber ich bin mir nicht sicher, ob sie es reduzieren werden. Der letzte Ansatz hängt von den reellen Zahlen ab, da die Multiplikation von hohen Werten länger dauert. – Adirio

Verwandte Themen