В чем разница между этими двумя функциями для 394. Декодировать строку?

Я пытаюсь решить 394. Декодировать строку в Leetcode, это было мое решение (я знаю, что оно неэффективно):

class Solution:
    def decodeString(self, s: str) -> str:
        stack = []

        for ch in s:
            if ch != ']':
                stack.append(ch)
            else:
                new_s = ''
                while stack[-1] != '[':
                    new_s += stack.pop()
                new_s = new_s[::-1]
                stack.pop()

                number = ''
                while stack and stack[-1].isdigit():
                    print(stack[-1])
                    number += stack.pop()
                number = int(number[::-1])

                
                print(new_s)
                stack.append(number * new_s)
        
        return "".join(stack) 

и это рабочее решение:

class Solution:
    def decodeString(self, s: str) -> str:
        stack = []

        for ch in s:
            if ch != ']':
                stack.append(ch)
            else:
                # Collect the characters forming the encoded string
                decoded_string = []
                while stack[-1] != '[':
                    decoded_string.append(stack.pop())
                stack.pop()  # Remove the '['
                
                # Now reverse the decoded string to get the correct order
                decoded_string = ''.join(decoded_string[::-1])
                
                # Get the number (how many times to repeat)
                number = []
                while stack and stack[-1].isdigit():
                    number.append(stack.pop())
                number = int(''.join(number[::-1]))

                # Append the repeated decoded string back to the stack
                stack.append(number * decoded_string)
        
        return "".join(stack)

Почему не работает первая функция? Я действительно думаю, что нет никакой разницы, кроме того, что я переворачиваю строку, а правильный код переворачивает список.

Ввод: 3[z]2[2[y]pq4[2[jk]e1[f]]]ef

Выход:

zzzyypqfejkjkfejkjkfejkjkfejkjkyypqfejkjkfejkjkfejkjkfejkjkef

Ожидал:

zzzyypqjkjkefjkjkefjkjkefjkjkefyypqjkjkefjkjkefjkjkefjkjkefef

Я просто не понимаю, почему один алгоритм работает, а другой нет...

На каком тесте он не проходит? Очевидно, что это работает на трех образцах.

Tim Roberts 20.08.2024 01:18

Привет, Тим, это не удается: вывод «3[z]2[2[y]pq4[2[jk]e1[f]]]ef»: ожидается «zzzyypqfejkjkfejkjkfejkjkfejkjkyypqfejkjkfejkjkfejkjkfejkjk‌​ef»: «zzzyypqjkjkefjkjkefjkjkefjkjke» fyypqjkjkefjkjkefjkjkefjkjkef‌​ef"

kirych.hevc 20.08.2024 01:20

Итак, мы видим, что происходит какое-то странное поведение, когда "ef" находится не в том месте, но я не понимаю, почему :(

kirych.hevc 20.08.2024 01:22

Что значит «не работает»? Каково ожидаемое поведение? Пробовали ли вы пройти построчно оба кода одновременно с помощью отладчика, чтобы сравнить поведение?

jabaa 20.08.2024 01:45

@jabaa все есть в комментариях выше. Спасибо

kirych.hevc 20.08.2024 01:52

Пожалуйста, добавьте все подробности в вопрос. Комментарии часто через некоторое время удаляются и не сохраняются в истории. Многие пользователи не читают все комментарии. Не могу найти описание кодов в комментариях. Я не могу найти результаты вашей отладки в комментариях. Спасибо.

jabaa 20.08.2024 01:53

Пожалуйста, отредактируйте вопрос, чтобы объяснить, что должен делать код. Мы не знаем проблем LeetCode по имени.

Barmar 20.08.2024 01:59

Более простой ввод — 2[2[ab]]. Первый подход возвращает babababa, а второй — abababab. Этот короткий ввод должно быть легче отлаживать.

jabaa 20.08.2024 02:05

Посмотрите Как отлаживать небольшие программы Эрика Липперта. Если у вас есть рабочий код для сравнения, шаг резиновой утки должен быть намного короче :) Хотя в этой программе некоторые другие шаги могут быть не очень полезными или практичными, например, разбиение вашего кода и написание спецификаций.

wjandrea 20.08.2024 02:22

Спасибо @Barmar за предложения. извините, это мой первый пост, поэтому я учусь :)

kirych.hevc 20.08.2024 02:43
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
4
10
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Разница здесь тонкая. Если бы вы напечатали стек в конце каждого цикла, вы бы его увидели. Вот трассировка стека вашего кода:

['zzz', '2', '[', 'yy', 'p', 'q', '4', '[', 'jkjk']
['zzz', '2', '[', 'yy', 'p', 'q', '4', '[', 'jkjk', 'e']
['zzz', '2', '[', 'yy', 'p', 'q', '4', '[', 'jkjk', 'e', '1']
['zzz', '2', '[', 'yy', 'p', 'q', '4', '[', 'jkjk', 'e', '1', '[']
['zzz', '2', '[', 'yy', 'p', 'q', '4', '[', 'jkjk', 'e', '1', '[', 'f']
['zzz', '2', '[', 'yy', 'p', 'q', '4', '[', 'jkjk', 'e', 'f']
['zzz', '2', '[', 'yy', 'p', 'q', 'kjkjefkjkjefkjkjefkjkjef']
['zzz', 'yypqfejkjkfejkjkfejkjkfejkjkyypqfejkjkfejkjkfejkjkfejkjk']

Против их кода:

['zzz', '2', '[', 'yy', 'p', 'q', '4', '[', 'jkjk']
['zzz', '2', '[', 'yy', 'p', 'q', '4', '[', 'jkjk', 'e']
['zzz', '2', '[', 'yy', 'p', 'q', '4', '[', 'jkjk', 'e', '1']
['zzz', '2', '[', 'yy', 'p', 'q', '4', '[', 'jkjk', 'e', '1', '[']
['zzz', '2', '[', 'yy', 'p', 'q', '4', '[', 'jkjk', 'e', '1', '[', 'f']
['zzz', '2', '[', 'yy', 'p', 'q', '4', '[', 'jkjk', 'e', 'f']
['zzz', '2', '[', 'yy', 'p', 'q', 'jkjkefjkjkefjkjkefjkjkef']
['zzz', 'yypqjkjkefjkjkefjkjkefjkjkefyypqjkjkefjkjkefjkjkefjkjkef']

Вы это видите? Когда стек содержит многосимвольную строку, ваш код инвертирует всю строку, поэтому «jkjkef» становится «fekjkj». ИХ код инвертирует список и объединяет результат, создавая «фейкджк». Строки в списке сохраняют свой порядок, как и должно быть.

Большое спасибо! Теперь я понял. Очень красивое объяснение

kirych.hevc 20.08.2024 02:22

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