題目:判斷一個整數是否是迴文數。迴文數是指正序(從左向右)和倒序(從右向左)讀都是一樣的整數。
示例1:
輸入: 121
輸出: true示例2:
輸入: -121
輸出: false
解釋: 從左向右讀, 為 -121 。 從右向左讀, 為 121- 。因此它不是一個迴文數示例3:
輸入: 10
輸出: false
解釋: 從右向左讀, 為 01 。因此它不是一個迴文數
解法:反轉一半數字
思路分析:
第一想到的兩種辦法是:
1、通過整數轉換字串反轉後判斷兩數是否相等(時間複雜度O(n))
2、數學方法全反轉(時間複雜度O(logn))
以上兩種方法可以解決,但不是最優的,因為還需要判斷是否益處
最佳的方法:還是使用數學方法進行反轉,但是隻需反轉一半即可
PHP程式碼實現:
/**
* @param Integer $x
* @return Boolean
*/
function isPalindrome($x){
//特殊情況
//1、小於0的負數肯定不是迴文數
//2、最後一位是0,且第一位也不是0,肯定不是迴文數
if($x < 0 || ($x%10 == 0 && $x != 0)){
return false;
}
$res = 0;//反轉後的數
while($x > $res){//當x小於等於res時,即已經反轉一半了
$res = $res*10 + $x%10;
$x = intval($x/10);//需要使用intval強制把浮點轉整型
}
//當x的位數為偶數時,比如1221,迴圈的最後,x=12,res=12
//當x的位數為奇數時,比如12321,迴圈的最後,x=12,res=123,但中間的位數對於迴文數沒有影響,所以res除以10可以剔除掉
return $x == $res || $x == intval($res/10);
}
使用:
var_dump(isPalindrome(121));
複雜度分析:
時間複雜度:O(log10(n))
對於每次迭代,我們會將輸入除以10
時間複雜度:O(1)
github
以後每次題解都會上傳到這個專案
題目來源
力扣(LeetCode):https://leetcode-cn.com/problems/palindrom...
本作品採用《CC 協議》,轉載必須註明作者和本文連結