每日一道演算法:迴文數

zhangdeTalk發表於2020-02-02

題目:判斷一個整數是否是迴文數。迴文數是指正序(從左向右)和倒序(從右向左)讀都是一樣的整數。

示例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_PHP:https://github.com/zhangdejian/LeetCode_PHP

題目來源

力扣(LeetCode):https://leetcode-cn.com/problems/palindrom...

本作品採用《CC 協議》,轉載必須註明作者和本文連結

阿德

相關文章