Считать ли пустую строку палиндромом
Что проверяют
Как вы обращаетесь с краевыми случаями. Интервьюер не ждёт философского ответа: он смотрит, уточните ли вы контракт до написания кода и обработаете ли пустой ввод осознанно, а не случайно.
Как отвечать
Формально да: в пустой строке нет позиции, где прямое и обратное чтение расходятся, поэтому она палиндром так же, как строка из одного символа. Но это ответ математика. Инженерный звучит иначе: это решение контракта, и его надо зафиксировать.
Проговорите три вещи: что вернуть на пустой строке, что на null и что делать с пробелами, регистром и небуквенными символами. В Kotlin разница между пустой строкой и null это разница между корректным вводом и ошибкой, молча уравнивать их нельзя.
fun isPalindrome(s: String): Boolean {
var i = 0
var j = s.length - 1
while (i < j) {
if (!s.get(i).equals(s.get(j), ignoreCase = true)) return false
i++
j--
}
return true
}Цикл для пустой строки не выполняется ни разу, и true возвращается не потому, что вы так решили, а потому что так вышло. Скажите это сами: пустая строка даст true, меня это устраивает, но если по условию нужна ошибка, добавлю проверку в начале.
Для Android добавьте прикладной слой: строка приходит из поля ввода, а значит пустой бывает почти всегда при первом рендере, и падать на этом нельзя. Регистр приводите через lowercaseChar() или lowercase() с явной локалью: в турецкой локали I переходит не в i, и на устройстве с такими настройками сравнение ломается.
Где спотыкаются
Спорят о правильном определении вместо того, чтобы задать вопрос по условию. Интервьюер хочет услышать уточнение, а не эрудицию, и спор тут работает против кандидата.
Второе: разворачивают строку целиком через reversed() и считают задачу закрытой. Ответ верный, но это лишняя аллокация на всю строку, и к вопросу о решении без дополнительной памяти человек оказывается не готов.
Третье: сравнивают символы напрямую, забыв про суррогатные пары. В JVM Char это единица UTF-16, эмодзи или редкий иероглиф занимают два таких значения, и посимвольный разворот их портит. Для пользовательского ввода честнее обходить строку по кодовым точкам.