2016-06-30 21 views
0

Gegeben sei eine Folge nichtnegativer Ganzzahlen a0,…,an−1, finde das maximale paarweise Produkt, das heißt, die größte ganze Zahl, die durch Multiplikation zweier verschiedener Elemente aus der Folge erhalten werden kann (oder formell, max0≤i≠j≤n−1aiaj). Verschiedene Elemente bedeuten hier ai und aj mit i≠j (es kann der Fall sein, dass ai=aj).Mein Code funktioniert nicht jedes Mal, wenn ich ihn starte

Eingabeformat

Die erste Zeile der Eingabe enthält eine ganze Zahl n. Die nächste Zeile enthält n nicht negative Ganzzahlen a0,…,an−1.

Constraints

2≤n≤2⋅105; 0≤a0,…,an−1≤105.

Ausgabeformat

Ausgang eine einzige Zahl - die maximale paarweise Produkt.

Dieser Code funktioniert gut, aber manchmal, wenn ich es laufen es zeigt:

Traceback (most recent call last): 
    File "C:\Users\gauta\AppData\Local\Programs\Python\Python35\gen.py", line 26, in <module> 
    print(max(c)) 
ValueError: max() arg is an empty sequence 

Es zeigt dies nur, wenn insgesamt Elemente in der Liste ‚a‘ sind 2 oder 3

Wie kann ich dies verbessern Code und beheben Sie dieses Problem, und zeigt dieser Code ein Zeitlimit überschritten oder Integer Overflow Bug?

import random 
import time 
b=time.time() 
a=list() 
c=list() 
n=random.randint(2,12) 
#appending random numbers in a list 'a' 
g=1 
while(g<=n): 
    a.append(random.randint(0,10)) 
    g=g+1 
print(a) 
print("Total elements in the list= %s"%len(a)) 
#Appending Done 
for i in range(2,n): 
    for j in range (2,n):    
     if a[i]*a[j]>0: 
      if a[i]!=a[j]: 
       m=a[i]*a[j] 
       c.append(m) 
      else: 
       continue 
     else: 
      continue 
print(max(c)) 
time=time.time()-b 
print("%s"%(time.time()-b)) 
+0

'time = time.time() - b' ersetzt den Namen' Time'. Dieser Code * funktioniert niemals *. –

+0

Sie überschreiben 'time' in der Zeile' time = time.time() - b', wechseln einfach zu 't = time.time() - b' und' print (t) ' – AChampion

+0

Dank dieses Zeitproblems. Irgendwelche Vorschläge, wie kann ich diesen Code arbeiten schneller und frei von Integer-Overflow-Fehler (falls vorhanden) –

Antwort

1

Es ist nicht Variablennamen zu verwenden, die Sie verwenden

auch der Name Module sind empfohlen
import random 
import time 
b=time.time() 
a=list() 
c=list() 
n=random.randint(2,12) 
#appending random numbers in a list 'a' 
g=1 
while(g<=n): 
    a.append(random.randint(0,10)) 
    g=g+1 
print(a) 
print("Total elements in the list= %s"%len(a)) 
#Appending Done 
for i in range(2,n): 
    for j in range (2,n): 
     if a[i]*a[j]>0: 
      if a[i]!=a[j]: 
       m=a[i]*a[j] 
       c.append(m) 
      else: 
       continue 
     else: 
      continue 
print(max(c)) 
othertime=time.time()-b 
print(type(othertime)) #here in this line you changed the time to float  value hence now onwards you can't use time module as you were using before hence i renamed time variable to other. 
print("%s" %(time.time()-b)) 

Variablenname Zeit andermal Durch Ändern Sie dieses Ding Zeitmodul wieder so erinnern können In Zukunft sollten Sie niemals Variablen mit Namen oder Schlüsselwörtern anderer Module benennen, sonst wird ihr Verhalten in Ihrem Code verloren gehen.

+0

Danke Rajan.Ich werde es korrigieren –

+0

Dies hat die zufällige "ValueError" Ausnahme nicht korrigiert. –

3

Ihr Code hat zwei Fehler:

  • Sie führen zwei Schleifen mit range(2, n), aber n kann zufällig 2 eingestellt werden. range(2, 2) ist eine leere Sequenz, so dass Ihr Körper Schleife nicht ausgeführt wird und Du mit einer leeren Liste am Ende c

  • Sie den Namen Maske time durch das Ergebnis des time.time() - b Ausdrucks zuweisen. Bei weiteren Versuchen, auf time.time zuzugreifen, erhalten Sie AttributeError, da ein Gleitkommaobjekt über kein solches Attribut verfügt. Benenne diese Variable um.

Als nächstes verwenden Sie einen O (N^2) Ansatz; exponentielle Zunahme der Zeit für jeden Anstieg der Anzahl der Elemente in a. Dies wird sicherlich die Fristen sehr schnell treffen. Alles, was Sie brauchen, ist die zwei größten Ganzzahlen in a zu finden und diese zu multiplizieren; Dies kann in O (N) linearer Zeit erfolgen. Wenn also len(a) 1000 ist, benötigt Ihr Ansatz 1 Million Schritte, während ein linearer Zeitansatz nur 1000 Schritte benötigt.

Der effizienteste Weg, um K größte Zahlen in einer Sequenz zu finden, ist die heapq.nlargest() function, die diese Zahlen in O (NlogK) Zeit findet; für ein festes K = 2 macht dies einen O (N) linearen Zeitansatz. Sie können die operator.mul() function verwenden, um die zwei ganzen Zahlen gefunden zu multiplizieren:

import heapq 
import operator 

if len(a) > 1: 
    result = operator.mul(*heapq.nlargest(2, a)) 
elif a: 
    result = a[0] # only one number, it's the largest 
else: 
    result = None # no numbers, no result 
+0

Danke Martijn.Ich war mir nicht bewusst, Heapq und Operator-Modul, jetzt kann ich es in meinem Code verwenden –

Verwandte Themen