Pull to refresh

Comments 27

Серьезно?

К чему этот пост? Задача даже не на джуна, а на здравую логику. К чему эти конкурсы вообще?

А по задаче приводим к единому регистру с равниваем первые и последние символы, отсекая на первом же несовпадении. Один while буквально или можно через for и if

Я бы еще понял если реально какая то интересная/заковыристая задача, но такое можно на капчу регистрации хабра вешать

Реверсировать строку и сравнить с исходной. Если равны -- true, иначе -- false. И никто циклов.

А реверс и сравнение строк под капотом у вас без циклов работает?

Есть стек. В начале его глубина равна 0. В стек помещаются и удаляются буквы по следующему правилу: если входящая буква равна букве на вершине стека, обе буквы удаляются. Иначе буква помещается в стек. Если после обработки строки глубина стека равна 0, строка является палиндромом.

Нда... Спасибо !

Можно так. Если длинна строки четная, то как раньше со стеком. Если нечетная - удаляется средняя буква (она может быть любой) и опять со стеком.

Не знаю, как у вас с питоном, но задача примитивная на этом языке ¯\_(ツ)_/¯

if str(x) == str(x)[::-1]:
  print("yes")
else:
  print("no")

Не проще, а короче. Алгоритм вы ничуть не поменяли

t = x.lower() # у нас уже строка, а палиндром без учёта регистра букв
print(['no', 'yes'][t == t[::-1]]) # слабая типицация: bool -> int

Еще проще

Print("yes" if x == "Alla" else "no")

Все как по условию просят)))

Только начинать нужно не с пустого стека, иначе "aabb" тоже палиндромом станет. Чтобы заработало, придется сначала половину строки в этот стек сложить без удалений.

А можно что-то с этим сделать, если известна длина строки в байтах, но не в символах, а кодировка предусматривает коды символов разной длины?

Именно на Python? Банально сравниваем на равенство исходную и инвертированную (срез [::-1]) строки, предварительно приведя их к одному регистру. Сложность - как и требуется - линейная, объём кода минимален (причём без ухудшения читабельности), а то, что коэф-т в несколько раз больше, чем у варианта @SUNsung, так Python и не предназначен для написания высокоэффективного кода.

// Не знаю я питона, будет псевдокод
function foo(name: String) -> bool {
    return name.to_lower() == name.to_lower().revert();
}

Считается?)

В js с некоторыми строками такое не пройдет:

'???'.split('').reverse().join('')

Кажется, я бы прошел техническое собеседование в компанию Selectel.
Только - зачем?

Интересно, а как обстоит дело с палиндромами на китайском или японском?

В языках с жестко ограниченной структурой слога - возможно, никак

def is_palindrom(text_for_evaluation: str) -> bool:
    """Функция для проверки строки на палиндром.
    
    Фукнция написана с соблюдением почти всех требований к коду на python)))
    Parameters:
    -----------
    text_for_evaluation: str
        текст для проверки, приводится к нижнему регистру  
    Return:
    -------
    bool, True если палиндром без учета регистра, иначе False
    """

    lower_text = text_for_evaluation.lower()
    return lower_text == lower_text[::-1]

Да, разумеется, эта функция не соблюдает еще пару требований:

  • документация не на английском, ай-яй-яй!

  • нет проверки на тип строки (и возврат None если не строка, либо исключение raise ValueError - в зависимости от практики, принятой в компании, пишущей код)

def is_palindrome(text):

return text.lower() == text[::-1].lower()

def is_palindrome(word):
    return (word.lower())[:(ceil(len(word)/2))] == (word.lower())[-1:(ceil(len(word)/2))]

Прошу простить ошибки в нюансах оформления, ибо в целом по жизни с кодом не работаю (=> не наношу такими вещами вред людям; и вообще, не волшебник — однако же учусь).

Всё, кто удалял символы и реверсил иммутабельную строку, занимались ненужным созданием в памяти новых объектов. Вместо использования одного цикла с курсором, выбрав количество итераций, равное результату целочисленного деления длины имени на 2.

Да, при использовании компилируемых языков такое решение безусловно эффективнее. Но в интерпретируемых языках (к коим относится и Python) всё не столь однозначно.

Каждая операция в языке с динамической типизацией - это большие накладные расходы. И сравнение в цикле десяти пар строк длины 1 (в Python нет символов - только строки) может производиться намного дольше, чем сравнение двух строк длины 20. Накладные расходы на сам цикл, на курсор, на доступ к элементам строки, на проверку типов операндов в каждой операции сравнения с одной стороны и единственная операция сравнения с единственной проверкой типов операндов другой стороны.

Так что без реальных экспериментов на разных входных данных невозможно сказать, что именно в Python будет эффективнее: две операции (однократное создание среза длины N и однократное сравнение среза и исходной строки) над длинными строками, или (N/2)*5 операций (цикл, дополнительный курсор, доступ по индексу слева, доступ по индексу справа, сравнение двух строк длины 1) выполняемых в оптимизированном алгоритме.

Sign up to leave a comment.