题目描述
这是
LeetCode上的 9. 回文数,难度为 简单。关键字:
数字、反转、回文数
给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。
回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。例如,121 是回文,而 123 不是。
示例 1:
输入:x = 121
输出:true
示例 2:
输入:x = -121
输出:false
解释:从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。
示例 3:
输入:x = 10
输出:false
解释:从右向左读, 为 01 。因此它不是一个回文数。
示例 4:
输入:x = -101
输出:false
提示:
-231 <= x <= 231 - 1
进阶:你能不将整数转为字符串来解决这个问题吗?
解题思路
我们首先的能想到的是将数字转换成字符串,然后判断字符串是否是回文字符串
class Solution {
public boolean isPalindrome(int x) {
// 数字转字符串
String s = String.valueOf(x);
int right = s.length() - 1;
char[] cs = s.toCharArray();
// 因为是判断是否是回文字符串,因此这里只需要遍历一般的字符就可以了
int mid = right / 2;
for (int i = 0; i <= mid; i++) {
// 判断对应位置字符是否一致
if (cs[i] != cs[right - i]) {
return false;
}
}
return true;
}
}
或者直接使用 StringBuilder 进行字符串反转
class Solution {
public boolean isPalindrome(int x) {
String str = String.valueOf(x);
StringBuilder sb = new StringBuilder(str);
sb.reverse();
return str.equals(sb.toString());
}
}
进阶实现
如果我们不将数字转换成字符串该怎么办呢?
我们首先想到的是将数字反转,但是这里有一个问题,如果反转之后的数字是一个超出整形范围的数字该怎么办呢?
我们可以只反转数字的一半长度,判断前半部分和后半部分(反转之后)是否一致,随着数字的逐渐遍历,所以回文数字(后半部分)会越来越大,前半部分(原数字)会越来越小,当 后半部分 > 前半部分 的时候,终止!
所以可以将数字分为两种类型:
- 输入数字为奇数:中间点是一个单独存在的数字,及不考虑中间点的话,
前半部分==后半部分(反转之后),如果考虑中间点的话就是前半部分==后半部分/10 - 输入数字为偶数:中间点在两个部分中间,
前半部分==后半部分
class Solution {
public boolean isPalindrome(int x) {
// 特殊情况判断:负数和末位是0且不是0(x0、xy0、xyz0)
if (x < 0 || (x % 10 == 0 && x != 0)) {
return false;
}
int ans = 0;
while (x > ans) {
// 整数反转
ans = ans * 10 + x % 10;
x /= 10;
}
// 偶数的时候前半部分和后半部分正好相等
// 奇数的时候后半部分会多一个数字到最后一位,所以去除最后一位在进行比较
return x == ans || x == ans / 10;
}
}
引用
我的 github 仓库已经同步建立,点击访问