#python
Вопрос:
у меня есть 2 кода. я не знаю, как рассчитать время
import sys
sys.stdin = open('input.txt')
ls = [1,2,3,4,5,6,7,8,9] [0]*999991
number = 10
k = 10
while True:
n = int(sys.stdin.readline())
if n == 0:
break
while ls[999999] == 0:
a = str(number)
if len(set(a)) != len(a):
number = 1
continue
ls[k-1] = number
k = 1
number = 1
print(ls[n-1])
import sys
sys.stdin = open('input.txt')
ls = [1,2,3,4,5,6,7,8,9]
number = 10
while True:
n = int(sys.stdin.readline())
if n == 0:
break
while len(ls) <= n-1:
a = str(number)
if len(set(a)) != len(a):
number = 1
continue
ls.append(number)
number = 1
print(ls[n-1])
У обоих кодов заканчивается время. Что я должен сделать, чтобы сэкономить время?
умоляю, помогите мне
ограничение памяти составляет 128 МБ, я думаю, что при проверке кода дублирования что-то не так…
Комментарии:
1. Использовать
time
модуль2. @PCM, если бы только у него был
save()
метод :-). Я подозреваю, что они оговорились, когда сказали «рассчитать время», и не сделали этого, когда сказали «сэкономить время».
Ответ №1:
Вместо того, чтобы перебирать все целые числа и отфильтровывать те, которые повторяются, вы могли бы просто пройти перестановки цифр, чтобы вам не нужно было фильтровать. (Хорошо, хорошо, я отфильтровываю (действительно пропускаю) числа с ведущими нулями, но это гораздо меньше.)
from itertools import permutations, dropwhile, chain, islice
import math
def numbers(digit_length):
no_repetitions = permutations(range(10), digit_length)
skip = math.perm(9, digit_length - 1)
no_lead_zeros = islice(no_repetitions, skip, None)
return no_lead_zeros
def solve(n):
all_numbers = chain(*map(numbers, range(1, 11)))
the_number = next(islice(all_numbers, n - 1, None))
return int(''.join(map(str, the_number)))
print(solve(10000))
Вывод (Попробуйте это онлайн!):
26057