Comments 27
Серьезно?
К чему этот пост? Задача даже не на джуна, а на здравую логику. К чему эти конкурсы вообще?
А по задаче приводим к единому регистру с равниваем первые и последние символы, отсекая на первом же несовпадении. Один while буквально или можно через for и if
Я бы еще понял если реально какая то интересная/заковыристая задача, но такое можно на капчу регистрации хабра вешать
Есть стек. В начале его глубина равна 0. В стек помещаются и удаляются буквы по следующему правилу: если входящая буква равна букве на вершине стека, обе буквы удаляются. Иначе буква помещается в стек. Если после обработки строки глубина стека равна 0, строка является палиндромом.
Топот
Нда... Спасибо !
Можно так. Если длинна строки четная, то как раньше со стеком. Если нечетная - удаляется средняя буква (она может быть любой) и опять со стеком.
Не знаю, как у вас с питоном, но задача примитивная на этом языке ¯\_(ツ)_/¯
if str(x) == str(x)[::-1]:
print("yes")
else:
print("no")
Тогда уж еще проще
print("yes" if str(x) == str(x)[::-1] else "no")
Только начинать нужно не с пустого стека, иначе "aabb" тоже палиндромом станет. Чтобы заработало, придется сначала половину строки в этот стек сложить без удалений.
А можно что-то с этим сделать, если известна длина строки в байтах, но не в символах, а кодировка предусматривает коды символов разной длины?
Именно на Python? Банально сравниваем на равенство исходную и инвертированную (срез [::-1]) строки, предварительно приведя их к одному регистру. Сложность - как и требуется - линейная, объём кода минимален (причём без ухудшения читабельности), а то, что коэф-т в несколько раз больше, чем у варианта @SUNsung, так Python и не предназначен для написания высокоэффективного кода.
// Не знаю я питона, будет псевдокод
function foo(name: String) -> bool {
return name.to_lower() == name.to_lower().revert();
}
Считается?)
Кажется, я бы прошел техническое собеседование в компанию Selectel.
Только - зачем?
Интересно, а как обстоит дело с палиндромами на китайском или японском?
def is_palindrome(word):
word = word.lower()
length = len(word)
return all(word[i] == word[length - i - 1] for i in range(length // 2))
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]
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) выполняемых в оптимизированном алгоритме.
Палиндром, ты ли это? Простая задачка для программистов