Есть ли способ сократить время и код для этого кода - PullRequest
0 голосов
/ 14 мая 2019

Я пишу программу, время выполнения которой равно O (n ^ 2), есть ли возможность уменьшить код и сложность без использования вложенных циклов forlops и встроенных функций, это проблема с целочисленным совпадением, и результат равен [4,5]


a = 12345
b = 49085
l1 = []
l2 = []
l_match = []
while(a != 0):
    c = a % 10
    l1.append(c)
    a //= 10
while(b!= 0):
    d = b % 10
    l2.append(d)
    b //= 10
for i in range(len(l1)):
    for j in range(len(l2)):
        if l1[i] == l2[j]:
            match = l1[i]
            l_match.append(match)
print(l_match)

Ответы [ 3 ]

2 голосов
/ 14 мая 2019

Вы можете преобразовать каждое число в набор цифровых символов, чтобы вы могли использовать набор пересечений для получения общих цифр между двумя числами в линейной сложности времени:

list(map(int, set(str(b)).intersection(set(str(a)))))

Возвращает:

[4, 5]
2 голосов
/ 14 мая 2019

Если я правильно понимаю, и поправьте меня, если я ошибаюсь, цель состоит в том, чтобы найти общие цифры между двумя числами.

Если это так, более простой способ сопоставления общих целых чисел - это получить уникальные цифры из обоих чисел через набор, а затем вычислить пересечение между ними

a = 12345
b = 49085

#Convert both numbers into a set to get unique digits
set_a = set(str(a))
set_b = set(str(b))

#Get common digits between both numbers
common = [int(a) for a in set_a.intersection(set_b)]

print(common)

Выход будет

[5, 4]
0 голосов
/ 14 мая 2019

В O (n) сложность времени

def find_chars_order_n(value1,value2):
  hsh = {}
  resp = set()     #Set is used to have unique Characters
  if str(value1) and str(value2):
    str1 = list(str(value1))
    str2 = list(str(value2))
  for elm in str2:
    hsh[elm] = elm
  for elm in str1:
    if hsh[elm]:
      resp.add(elm)
  # resp = str1 & str2 #using set intersection
  if resp:
    return list(resp))
  else:
    return None

if __name__ == "__main__":
  print(find_chars_order_n(1400,4011))
...