Программа курса:
Разбор задачи: Найди разницу
Предложенный нами код решения:
def find_added_letter(s, t):
"""
:param s: строка, из которой была создана строка t путём перемешивания символов и добавления одного символа.
:param t: строка, которая является результатом перемешивания s и добавления одного символа.
:return: символ, который был добавлен в строку t.
"""
# Сортируем строки и ищем лишний символ
s_sorted = sorted(s)
t_sorted = sorted(t)
for i in range(len(s_sorted)):
if s_sorted[i] != t_sorted[i]:
return t_sorted[i]
# Если весь s совпал с началом t, то последний символ t и будет добавленным
return t_sorted[-1]Шаг 1: Сортировка строк
Мы начинаем с того, что сортируем обе строки: s и t. Сортировка упрощает задачу, так как в отсортированных строках символы будут стоять на одинаковых позициях, если все символы из строки s присутствуют в строке t. Разница в этих строках будет проявляться только в одном символе — добавленном символе в строку t.
s_sorted = sorted(s)
t_sorted = sorted(t)Шаг 2: Сравнение символов
После сортировки мы начинаем сравнивать строки символ за символом. Если в какой-то момент символы в строках s_sorted и t_sorted не совпадают, это означает, что именно этот символ был добавлен в строку t. Мы сразу возвращаем этот символ:
for i in range(len(s_sorted)):
if s_sorted[i] != t_sorted[i]:
return t_sorted[i]Шаг 3: Возвращение последнего символа
Если весь набор символов строки s совпал с частью строки t, то последний символ строки t обязательно будет добавленным, поскольку строка t на одну позицию длиннее. В этом случае мы возвращаем последний символ строки t:
return t_sorted[-1]Пример
Для строк:
s = "abcd"t = "abcde"
После сортировки:
s_sorted = ['a', 'b', 'c', 'd']t_sorted = ['a', 'b', 'c', 'd', 'e']
Мы сравниваем символы:
'a' == 'a''b' == 'b''c' == 'c''d' == 'd'
На последнем шаге строка s_sorted заканчивается, а в строке t_sorted появляется символ 'e', который и является добавленным. Мы возвращаем 'e'.
xsnm
,s = "abcd"
t = "abcd" #=> Вывод: Ожидалось None, но получено 'd'
xsnm
,s = ""
t = ""
File "F:\pythom\The task book.py", line 53, in find_added_letter
return t_sorted[-1]
~~~~~~~~^^^^
IndexError: list index out of range
xsnm
,def find_added_letter_my_last(s, t):
print(s)
print(t)
res=[]
for k in range(len(t)):
if t[k] in s:
if t.count(t[k]) == 2:
# print(t[k])
res.append(t[k])
# return t[k]
else:
# print(t[k])
res.append(t[k])
# return t[k]
return ','.join(set(res))
Filaret
,На мой взгляд, в системе проверки заложен кейс, нарушающий условие задачи. Вот входные данные:
s = 'abcd'
t = 'dabcde'
Вспомним условие задачи.
tсоздаётся путём случайного перемешивания символов строкиs...". На мой взгляд, это означает, что в строке t присутствуют ровно те же символы и ровно в том же количестве, что и в строке s.Указанные входные данные, на мой взгляд, нарушают 2-е условие. В строке t добавлено 2 символа вместо одного. Из-за этого написанный мной код
def find_added_letter(s, t):s = list(s)t = list(t)while t:if len(s) == 0 or t[0] not in s:return t[0]s.remove(t.pop(0))на указанных входных данных возвращает букву 'd', а не 'e', как ожидает система проверки, хотя, насколько я понимаю, все остальные кейсы он проходит успешно. Считаю, что указанный тест-кейс нужно исправить.
P.S. Я не оспариваю приведенный в разборе код и не утверждаю, что мой чем-то лучше. Я лишь к тому, что задача может быть решена и вот таким путем, а из-за мелкой ошибки не засчитывается. Да, это тренировочная задача, и если что - можно тупо скопировать код из разбора и идти дальше, но ведь цель таких задач - не только научить пользоваться разными структурами данных, но и отточить умение представлять, что делает программа "под капотом". А если код, который вроде бы как должен отработать корректно, выдает ошибку, первая мысль - в коде ошибка, а значит, автор кода неправильно что-то там представил у себя в голове. И обидно потратить кучу времени на разбор кода, чтение тех или иных обучающих материалов, на переписывание и тестирование кода, а потом выяснить, что с кодом все было в порядке, а ошибка вылетела из-за некорректных входных данных.