Есть ли более быстрый способ сделать этот код быстрее?

Поэтому перед нами стояла задача сделать код ниже быстрее, так как есть примеры кода, где потребуется ввод очень больших строк, подойдёт любая помощь.


w = input()
e = input()

aasd = ''
i = 0

for i in range(len(w)):
    elif e[i] in w:
        aasd = aasd + 'b'
    i = i + 1

print(aasd)

Участие в редактировать войну неразумно. Как правило, если код работал/был синтаксически правильным перед редактированием, сохраните его в своем редактировании.

greybeard 22.03.2022 01:26
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
85
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Самая дорогая операция здесь кажется elif b[i] in a (со сложностью O(len(a)), так как поиск строки не оптимизирован как набор. Вы можете создать набор символов в a, чтобы сделать поиск быстрее.

import sys

z = int(input())
a = input()
set_a = set(a)
b = input()

strs = ''

for i in range(z):
    if b[i] == a[i]:
        strs = strs + 'a'
    elif b[i] in set_a:
        strs = strs + 'b'
    else:
        strs = strs + 'c'

sys.stdout.write(strs)

Звонить list на a не нужно. Строка является итерируемой.

trincot 21.03.2022 14:39

@trincot хороший улов

Abhinav Mathur 21.03.2022 14:40

Обратите внимание, что этот код может завершиться ошибкой, если z больше, чем любой из массивов, так как индекс выйдет за пределы. То же самое верно, если z была установлена ​​​​длина a, но массив b короче, чем a, и, конечно, наоборот.

Mushroomator 21.03.2022 14:41

@Mushroomator OP не запрашивал отладку кода. Ускорение было единственным условием здесь, которое было обеспечено

Abhinav Mathur 21.03.2022 14:43

@AbhinavMathur правда. Тем не менее, я думаю, что хорошо дать новичку несколько намеков на то, какие еще проблемы есть с его кодом, это все, чего я хотел добиться.

Mushroomator 21.03.2022 14:46

Следующая функция выполнит работу с изменением ключа, используя set() вместо списка, что уменьшит время выполнения с O(len(a) * len(b)) до O(len(a)).

Некоторые другие изменения - это некоторые проверки длины массива, которые вам нужно сделать, чтобы убедиться, что ваш индекс не выйдет за пределы массива.

import sys

# what do you need z for?
# this will only cause problems, you can use len() instead to get the lenght of the string
# z = int(input())
a = input("Please enter string a: ")
b = input("Please enter string b: ")


def compare_strs(a, b):
    strs = ''
    # no need for this here as range will start at 0 by default
    # i = 0
    # set will have constant lookup time O(1)
    lookupCharacters = set(a)
    for i in range(len(a)):
        # you need to make sure the index is in bounds of the array here!
        if i < len(b):
            if b[i] == a[i]:
                strs = strs + 'a'
            # this will now lookup in the set which takes O(1) and not O(len(a))
            elif b[i] in lookupCharacters:
                strs = strs + 'b'
        strs = strs + 'c'
        # no need for this here as range() will automatically increase i for the next iteration
        # i = i + 1
    sys.stdout.write(strs)


compare_strs(a, b)

Извините, здесь опечатка. Очевидно, имелось в виду использование lookupCharacters вместо a. Обновил мой ответ.

Mushroomator 21.03.2022 14:56

Другие вопросы по теме