題目要求
Determine whether an integer is a palindrome. An integer is a palindrome when it reads the same backward as forward.
判斷一個整數是否是迴文數。迴文數是指正序(從左向右)和倒序(從右向左)讀都是一樣的整數。
鏈接:https://leetcode-cn.com/problems/palindrome-number
示例
Input: 121 Output: true
Input: -121 Output: false
Explanation: From left to right, it reads -121. From right to left, it becomes 121-. Therefore it is not a palindrome.Input: 10 Output: false
Explanation: Reads 01 from right to left. Therefore it is not a palindrome.
題解思路
1.比較直觀想到的就是轉換成字符串做反轉操作。
2.題設建議是不要用轉換字符串的方式去做,那麼我想到的思路是先考慮一些邊界情況,這個數是負數的情況。去掉一些邊界情況,將整個數進行反轉,如果反轉後的數字和原始數字相同,那麼這個數字就是迴文。例如,輸入 1221,我們可以將數字 1221,整個反轉爲1221,並對兩個數字進行比較,如果相同的話,就是迴文。
這個逆轉的操作,對於數字1221,可以首先執行1221%10的操作得到1,然後要得到倒數第二個數字,可以將1221除以10,再求餘數得到,同時將最後一位數字乘以10再加上倒數第二位的數字,那麼就是1*10+2 = 12,就得到了想要的結果,以此類推,就得到了逆轉後的數字了。
首先是前面第一和第二種的解法
java版本
1// 直接字符串反轉求解
2class Solution {
3 public boolean isPalindrome(int x) {
4 String result = new StringBuilder(x + "").reverse().toString();
5 return result.equals(String.valueOf(x));
6
7 }
8}
1class Solution {
2 public boolean isPalindrome(int x) {
3 if (x < 0 ) {
4 return false;
5 }
6 int originX = x;
7 int reverseNum = 0;
8 while(x != 0) {
9 reverseNum = reverseNum * 10 + x %10;
10 x = x/ 10;
11 }
12
13 return originX == reverseNum;
14 }
15}
官方還給了一種題解
官方給的題解是隻需要求一半的數字即可,比如說1221,那麼求到下半部分12,發現和上半部分12相等,即可退出,比如說12321,那麼求到下半部分123,發現比12大,那麼就退出,如果是非迴文,那麼只要下半部數比上半部數大時即可退出循環。
不過我感覺官方給的題解,不是很好理解,但是他這邊考慮了可能完全逆轉會有溢出的問題,從時間效率上來說和第二種差別不大。
1class Solution {
2 public boolean isPalindrome(int x) {
3 if (x < 0 ) {
4 return false;
5 }
6
7 if (x % 10 ==0 && x!=0) {
8 return false;
9 }
10
11 int reverseNum = 0;
12 while(x > reverseNum) {
13 reverseNum = reverseNum * 10 + x %10;
14 x = x/ 10;
15 }
16
17 return x == reverseNum || x == reverseNum/10;
18 }
19}