题目地址(9. 回文数)
https://leetcode-cn.com/problems/palindrome-number/
题目描述
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| 给你一个整数 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
进阶:你能不将整数转为字符串来解决这个问题吗?
|
前置知识
公司
思路1
此题如果采用最基础的解法就是将给定数字转化为字符串,然后使用str.charAt(i)函数首位对比,然后进行判断
关键点1
代码1(转化为字符串)
Java Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| class Solution { public boolean isPalindrome(int x) { String str=x+""; int i=0; int j=str.length()-1; while(j>=i){ if(str.charAt(i)==str.charAt(j)){ i++; j--; } else return false; } return true; } }
|
思路2
上述思路1的解法需要另开辟新的空间,不符合题目原意,这里使用数字翻转的做法,将数字对半分开,将后半部分分开,对比两部分是否相同,如果是奇数则不考虑中间位置,即两部分在数量上是一致的。
关键点2
代码2(数字翻转)
Java Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| class Solution { public boolean isPalindrome(int x) { if(x<0) return false; if(x/10==0) return true; int n=0; int tmp=x; while(tmp>0){ tmp=tmp/10; n++; } int divide=0; if(n%2!=0) divide=n/2+1; else divide=n/2; int pre; int last=0; pre=(int)(x/Math.pow(10,divide)); int temp=0; for(int i=1;i<=n/2;i++){ temp=x%10; last=last*10+temp; x=x/10; } if(pre==last)return true; else return false; } }
|
复杂度分析
令 n 为数组长度。