у меня есть вопрос по этой проблеме. (SLPC 2004 без повторов)

#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