2016-11-02 1 views
1

"Sie erhalten ein Array von n ganzen Zahlen und einer ganzen Zahl k. Suchen und drucken Sie die Anzahl der (i,j) Paare, wobei i<j and a[i] + a[j] durch k teilbar ist."Python: Was stimmt nicht mit der Indexierungslogik in meinem Code?

Probeneingang wäre:

6 3 
1 3 2 6 1 2 

wo n 6 ist, k 3 ist und die zweite Linie ist das Array von ganzen Zahlen. Der Ausgang für diesen Eingang wäre 5.

Hier ist mein Code, aber ich bin nicht übergeben die Testfälle und bin fast positiv, es hat damit zu tun, wie ich es indexiere.

Auch Follow-up Frage: Ist diese Methode ich nähern sich einem effizienten Weg darüber zu gehen?

+0

Sie verwenden 'i + j' in Ihrem Code als das' j' in der Frage, richtig? Wenn ja, lösen Sie es nicht für "i

+2

Ich bin nicht sicher, ob 'für j in range (curr):' gut ist. Ich würde eher 'für j im Bereich (i + 1, n) tun:' This 'i furas

Antwort

2

Sie können versuchen, diese ...

import sys 
n,k = input().strip().split(' ') 
n,k = [int(n),int(k)] 
a = [int(a_temp) for a_temp in input().strip().split(' ')]   
print(sum([1 for i in range(n) for j in range(i) if (a[i]+a[j])%k==0])) 
+0

Dachte nie so, danke! –

+1

Sie können [] in der Summe entfernen und wie einen Generator verwenden, wie in 'sum (1 für i im Bereich (n) für j im Bereich (i) wenn (a [i] + a [j])% k = = 0) ' – xtreak

+0

Können Sie erklären, was in der print-Anweisung vor sich geht? Was bedeutet "1 für i" und warum "für j im Bereich (i)"? –

2
  • k % ... bedeutet "k teilbar durch ...", nicht "... ist teilbar durch k".
  • if i < i + j ist nicht sehr nützlich; Sie tun besser, was Furas in Kommentaren empfiehlt.
+0

Wow, duh! Ich danke dir sehr! –

+0

Ihr Code akzeptiert auch die Fälle, wo 'i == j 'Sie müssen auch Ihre Schleife zu beheben –

+0

Ja, ich habe in meinem eingereichten Code. Was ist falsch an der Schleife? Meinst du nur den i == j Fall? –

0

Was brauchen Sie ist die Verwendung von itertools.combinations zu machen:

from itertools import combinations 

count = 0 
for i, j in combinations(range(n), 2): 
    if i < j and (a[i] + a[j]) % k == 0: 
     print i, j 
     count += 1 

Diskussion

  1. range(n) gibt eine Liste von Indizes 0 .. n-1
  2. combinations(range(n), 2) wird eine Liste von zwei Indizes (ohne Verdoppelungen)
  3. (a[i] + a[j]) % k == 0 ist der Test ergeben, dass Ihr
  4. Hinweis darum gebeten, dass combinations Paare i ergeben wird, j, wo ich immer als j weniger ist, aber der Test i < j ist es als paranoide Maßnahme