Разбор задачи: Найди разницу

Предложенный нами код решения:

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']

Мы сравниваем символы:

  1. 'a' == 'a'
  2. 'b' == 'b'
  3. 'c' == 'c'
  4. 'd' == 'd'

На последнем шаге строка s_sorted заканчивается, а в строке t_sorted появляется символ 'e', который и является добавленным. Мы возвращаем 'e'.

 



Комментарии

xsnm_avatar
xsnm
,
6 месяцев, 3 дня назад

s = "abcd"
t  = "abcd"  #=> Вывод:  Ожидалось None, но получено 'd'


 

-1
xsnm_avatar
xsnm
,
6 месяцев, 3 дня назад

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
 

-1
xsnm_avatar
xsnm
,
6 месяцев, 3 дня назад

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))
 

0
Filaret_avatar
Filaret
,
18 дней назад

На мой взгляд, в системе проверки заложен кейс, нарушающий условие задачи. Вот входные данные:

s = 'abcd'

t = 'dabcde'

Вспомним условие задачи.

  1. "Строка t создаётся путём случайного перемешивания символов строки s...". На мой взгляд, это означает, что в строке t присутствуют ровно те же символы и ровно в том же количестве, что и в строке s.
  2. "...и добавления одного дополнительного символа в случайное место." На мой взгляд, это означает, что в строку добавлен ровно один дополнительный символ. При этом не уточняется, был ли до добавления такой символ в строке или нет (т.е. нельзя рассчитывать на то, что добавленный символ уникален в рамках строки).

Указанные входные данные, на мой взгляд, нарушают 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. Я не оспариваю приведенный в разборе код и не утверждаю, что мой чем-то лучше. Я лишь к тому, что задача может быть решена и вот таким путем, а из-за мелкой ошибки не засчитывается. Да, это тренировочная задача, и если что - можно тупо скопировать код из разбора и идти дальше, но ведь цель таких задач - не только научить пользоваться разными структурами данных, но и отточить умение представлять, что делает программа "под капотом". А если код, который вроде бы как должен отработать корректно, выдает ошибку, первая мысль - в коде ошибка, а значит, автор кода неправильно что-то там представил у себя в голове. И обидно потратить кучу времени на разбор кода, чтение тех или иных обучающих материалов, на переписывание и тестирование кода, а потом выяснить, что с кодом все было в порядке, а ошибка вылетела из-за некорректных входных данных.

0

Вы должны Войти или Зарегистрироваться чтобы оставлять комментарии