一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第11天,点击查看活动详情。
给你一个整数 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
1. 转为字符串判断
将给定的数字转为字符串,判断正向的字符串和逆向的字符串是否相等
class Solution {
public boolean isPalindrome(int x) {
String tempx = String.valueOf(x);
String reversex = new StringBuffer(tempx).reverse().toString();
if(tempx.equals(reversex)){
return true;
}
return false;
}
}
优点: 容易理解
缺点: 占用内存大
2. 不使用字符串,直接对数字首尾判断
不使用字符串,直接对数字进行首尾判断
获取第一位数字使用除法可以得到
获取最后一位数字可以使用取模得到
class Solution {
public boolean isPalindrome(int x) {
// 排除边界
if(x==0){
return true;
}
if(x%10==0 || x<0){
return false;
}
// 获取数字的长度
int length = 1;
while(x/length>=10){
length*=10;
}
// 循环判断首尾数字
while(x>0){
if(x/length!=x%10){
return false;
}
// 每次将头尾两个数字去掉,获取剩下的数字
x=(x%length)/10;
// 长度每次都要除以100
length/=100;
}
return true;
}
}
执行时间有所优化,内存占用没有太大提升
3. 将数字分为两半
看了题解...
将给定的数字分为两半,前一半和后一半比较
比如 1221 前一半为12 后一半为21(反转后为12),这样去比较
class Solution {
public boolean isPalindrome(int x) {
// 排除边界
if(x==0){
return true;
}
if(x%10==0 || x<0){
return false;
}
// 将数字分为两半 获取后一半数字
int halfnum = 0;
while(halfnum<x){
halfnum = halfnum*10 + x%10;
x/=10;
}
// 分成两半的时候需要区分偶数和基数,偶数可以直接== 奇数就需要排除后一半的一位 /10
return halfnum == x || halfnum/10 == x;
}
}
效率100%,但是内存占用还是比较高