Название взято из выпуска LeetCode № 9: Количество палиндромов. Сложность вопроса — «Легко», а текущий проходной балл — 56,0%.
Описание темы
Определяет, является ли целое число палиндромом. Палиндром — это целое число, которое одинаково читается в положительном порядке (слева направо) и в обратном порядке (справа налево).
Пример 1:
输入: 121
输出: true
Пример 2:
输入: -121
输出: false
解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。
Пример 3:
输入: 10
输出: false
解释: 从右向左读, 为 01 。因此它不是一个回文数。
Передовой:
Можете ли вы решить это, не преобразовывая целые числа в строки?
Тематический анализ
Решение 1: Общее решение
Лучший способ понять это — сначалаЦелое число в строку, а затем разбить строку на массивы, вам нужно только зациклить половину длины массива, чтобы определить, равны ли соответствующие элементы.
описание анимации
Код
///简单粗暴,看看就行
class Solution {
public boolean isPalindrome(int x) {
String reversedStr = (new StringBuilder(x + "")).reverse().toString();
return (x + "").equals(reversedStr);
}
}
Решение 2. Усовершенствованное решение --- математическое решение
Соответствующие числа в целых числах получаются округлением и операциями сравнения остатка.
Например: число 1221.
- Подсчитав 1221/1000, получим первую 1
- Вычислив 1221 % 10, можно получить последнюю 1
- Сравнивать
- Затем выньте 22, чтобы продолжить сравнение.
описание анимации
Код
class Solution {
public boolean isPalindrome(int x) {
//边界判断
if (x < 0) return false;
int div = 1;
//
while (x / div >= 10) div *= 10;
while (x > 0) {
int left = x / div;
int right = x % 10;
if (left != right) return false;
x = (x % div) / 10;
div /= 100;
}
return true;
}
}
Решение 3: Расширенное решение --- гениальное решение
Интуитивно глядя на числа-палиндромы, создается впечатление, что числа складываются пополам, чтобы посмотреть, могут ли они совпасть одно за другим.
Таким образом, действие этого решенияВыньте вторую половину чисел и переверните их.
Здесь следует отметить, что, поскольку количество цифр палиндрома может быть нечетным или четным, когда его длина четная, оно должно быть равным при сложении пополам; когда его длина нечетная, то после сложения пополам, Есть длина, которую нужно отбросить на одну цифру (поделить на 10 и округлить в большую сторону).
Конкретные методы заключаются в следующем:
- Каждый раз, когда выполняется остаточная операция (%10), извлекается наименьшее число:
y = x % 10
- Добавьте наименьшее число в конец полученного числа:
revertNum = revertNum * 10 + y
- Для каждой младшей значащей цифры x делится на 10
- судить
x
это меньше, чемrevertNum
, когда он меньше, это означает, что число было вдвое или больше половины - Наконец, оцените нечетные и четные числа: если оно четное, то revertNum равно x; если оно нечетное, среднее число находится в самом младшем бите revertNum, и оно должно быть равно x после деления на 10.
описание анимации
Код
class Solution {
public boolean isPalindrome(int x) {
//思考:这里大家可以思考一下,为什么末尾为 0 就可以直接返回 false
if (x < 0 || (x % 10 == 0 && x != 0)) return false;
int revertedNumber = 0;
while (x > revertedNumber) {
revertedNumber = revertedNumber * 10 + x % 10;
x /= 10;
}
return x == revertedNumber || x == revertedNumber / 10;
}
}
End
Дань LGD