найти все возможные комбо-пары в списке, сумма которых = 0 в python, используя dict - PullRequest
0 голосов
/ 11 июля 2020

Способ печати заключается в том, что меньшее число должно печататься первым и следующим. За исключением двух, все тесты пройдены. Идея кода заключается в том, что я сохраняю числа и их частоту в словаре, а затем просматриваю словарь и проверяю - (число), и, если присутствует, я печатаю число, как в частоте, и делаю их частоту как 0

  def pairSum0(l):
       if len(l)==0:
            return
       map = {} 
       for num in l: #to store the freq of each number
           if num in map: 
              map[num] += 1 
           else: 
              map[num] = 1
       for i in map:
           if -i in map and map[i]!=0 and map[-i]!=0:
                      if map[i]==map[-i]:#k is getting the number of time the number is present
                            k=map[i]
                      if map[i]<map[-i]:
                            k=map[-i]
                      else:
                            k=map[i]
                      for j in range(k):
            
                              if -i<i:
                                  print(-i,i)
                              else:
                                   print(i,-i)
                              map[i]=0
                              map[-i]=0
        


   n=int(input())
   l=list(int(i) for i in input().strip().split(' '))
   pairSum0(l)

Где код, который дает неверные результаты. Может ли кто-нибудь помочь мне отладить его? один неудачный тестовый пример: 6 0 0 0 0 -1 1 мой результат 0 0 0 0 0 0 0 0 0 -1 1 желаемый результат: 0 0 0 0 0 0 0 0 0 0 0 0 -1 1

1 Ответ

1 голос
/ 11 июля 2020
def pairsum(l):
    d = {}
    for i in l:
        if i not in d: d[i] = 0
        d[i] += 1
    for i in l:
        if i in d and (-i) in d:
            pair = f"{min(i,-i)} {max(i,-i)}"
            a,b = d[i],d[-i]
            if i != -i:
                for k in range(a*b):
                    print(pair)
                del d[i]
                del d[-i]
            else:
                for k in range(int(a*(a-1)/2)):
                    print(pair)
                del d[0]

Проблема в том, что вы можете комбинировать каждое целое число = i с любым другим = -i, что означает, что существует amount(i)*amount(-i) пар. Ноль - это особый случай, потому что вы можете комбинировать каждый ноль с любым другим, но не с самим собой, что дает n(n-1)/2 возможностей.

...