演算法的實戰(四):LeetCode -- Palindrome Number
阿新 • • 發佈:2018-12-13
一 題目描述
判斷一個整數是否是迴文數。迴文數是指正序(從左向右)和倒序(從右向左)讀都是一樣的整數。
示例 1:
輸入: 121 輸出: true
示例 2:
輸入: -121 輸出: false 解釋: 從左向右讀, 為 -121 。 從右向左讀, 為 121- 。因此它不是一個迴文數。
示例 3:
輸入: 10 輸出: false 解釋: 從右向左讀, 為 01 。因此它不是一個迴文數。
進階:
你能不將整數轉為字串來解決這個問題嗎?
二 解題思路
1.這道題我們第一時間可以聯想到我們上一道題-反轉數,只要反轉數跟原來的數一樣就返回true即可
2.但其中有一些可以優化的點:a.只要為負數的,都應該直接返回false; b.只要小於10 的正整數,都應該直接返回true,這樣可以省掉很多計算和比較次數,但最壞的情況可能會導致比較次數增多(測試的用列如果都是大於10的整數,兩個前提都會多增加兩次的比較)
三 程式碼實戰
public static int reverse (int x) { int reverse = 0; while (x!=0){ reverse = reverse * 10 + x % 10; x/=10; } if(reverse>Integer.MAX_VALUE||reverse<Integer.MIN_VALUE){ return 0; } return reverse; } public static boolean isPalindrome (int x){ if(x<0){ return false; } if(x<10){ return true; } if(x==reverse(x)){ return true; } return false; }
四 擴充套件點
用反轉的方法再優化最好的時間複雜度為O(n)(除了兩個特例(負數和小於10)的時間複雜度為O(1))(因為你得遍歷整數的位數)
但還有一種更加有優化空間的是用string來代替num型別的方法(但本題建議是不將它轉換成字串來解決,故不用此方法)
解題思路還是我之前的二分法思想,遍歷該數的一半長度,每一次把相對稱的元素進行對比,只要不相同則直接返回false,時間複雜度為O(n/2),程式碼例項如下:
public boolean isPalindrome(int x) { String s = ""+x; for(int i = 0;i < s.length()/2;i++) { if(s.charAt(i) != s.charAt(s.length()-1-i)) { return false; } } return true; }