文章目录
- 题目描述
- 方法一 转换为字符串
- 方法二 转存入数组
- 方法三 数学方法倒转数字
- 方法四 对折
- 参考文献
题目描述
给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。
回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
例如,121 是回文,而 123 不是。
示例 1:
输入:x = 121
输出:true
示例 2:
输入:x = -121
输出:false
解释:从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。
示例 3:
输入:x = 10
输出:false
解释:从右向左读, 为 01 。因此它不是一个回文数。
提示:
-231 <= x <= 231 - 1
方法一 转换为字符串
这里主要学习一下如何将数字转换为字符串。
这种方法可以看到执行用时非常长,说明这种方法不可取,应该还有更好的方法,得琢磨琢磨。
class Solution {
public boolean isPalindrome(int x) {
if(x<0)
return false;
String s=x+"";
int len=s.length();
boolean flg=false;
for(int i=0;i<len/2;i++){
if(s.charAt(i)!=s.charAt(len-i-1)){
flg=true;
break;
}
}
if(flg)
return false;
else
return true;
}
}
方法二 转存入数组
这种方法和方法一感觉差不多,但神奇的是这种方法要快一点,但似乎也不是最优的。
这里主要可以提高的是2的31次方是十位数,所以创建数组的时候大小为10就可以,而不用非得一来就弄一个100的。
class Solution {
public boolean isPalindrome(int x) {
if(x<0){
return false;
}
int[] arr=new int[10];
int i=0;
while(x>0){
arr[i]=x%10;
x=x/10;
i++;
}
boolean flg=false;
for(int j=0;j<i/2;j++){
if(arr[j]!=arr[i-j-1]){
flg=true;
break;
}
}
if(flg){
return false;
}else{
return true;
}
}
}
方法三 数学方法倒转数字
这里主要是觉得倒转数字的过程很巧妙,可为什么还是那么慢呢,没到100%,到底是有什么更好的方法吗?
class Solution {
public boolean isPalindrome(int x) {
if(x<0){
return false;
}
int num=x;
int cur=0;
while(num>0){
cur=cur*10+num%10;
num=num/10;
}
return cur==x;
}
}
方法四 对折
这就很离谱,相比于方法三应该算是改进了许多了啊,为什么用时还是很慢呢?
参考文献
方法三参考文献
https://leetcode.cn/problems/palindrome-number/solution/hua-jie-suan-fa-9-hui-wen-shu-by-guanpengchn/
方法四参考文献
https://leetcode.cn/problems/palindrome-number/solution/dong-hua-hui-wen-shu-de-san-chong-jie-fa-fa-jie-ch/