動畫:迴文數的三種解法 | 法解種三的數文回:畫動

題目來源於 LeetCode 第 9 號問題:迴文數。題目難度爲 Easy,目前經過率爲 56.0%。java

題目描述

判斷一個整數是不是迴文數。迴文數是指正序(從左向右)和倒序(從右向左)讀都是同樣的整數。數組

示例 1:bash

輸入: 121
輸出: true
複製代碼

示例 2:動畫

輸入: -121
輸出: false
解釋: 從左向右讀, 爲 -121 。 從右向左讀, 爲 121- 。所以它不是一個迴文數。
複製代碼

示例 3:ui

輸入: 10
輸出: false
解釋: 從右向左讀, 爲 01 。所以它不是一個迴文數。
複製代碼

進階:spa

你能不將整數轉爲字符串來解決這個問題嗎?code

題目解析

解法一:普通解法

最好理解的一種解法就是先將 整數轉爲字符串 ,而後將字符串分割爲數組,只須要循環數組的一半長度進行判斷對應元素是否相等便可。cdn

動畫描述

代碼實現

///簡單粗暴,看看就行
class Solution {
    public boolean isPalindrome(int x) {
        String reversedStr = (new StringBuilder(x + "")).reverse().toString();
        return (x + "").equals(reversedStr);
    }
}
複製代碼

解法二:進階解法---數學解法

經過取整和取餘操做獲取整數中對應的數字進行比較。blog

舉個例子:1221 這個數字。字符串

  • 經過計算 1221 / 1000, 得首位1
  • 經過計算 1221 % 10, 可得末位 1
  • 進行比較
  • 再將 22 取出來繼續比較

動畫描述

代碼實現

class Solution {
    public boolean isPalindrome(int x) {
        //邊界判斷
        if (x < 0) return false;
        int div = 1;
        //
        while (x / div >= 10) div *= 10;
        while (x > 0) {
            int left = x / div;
            int right = x % 10;
            if (left != right) return false;
            x = (x % div) / 10;
            div /= 100;
        }
        return true;
    }
}
複製代碼

解法三:進階解法---巧妙解法

直觀上來看待迴文數的話,就感受像是將數字進行對摺後看可否一一對應。

因此這個解法的操做就是 取出後半段數字進行翻轉

這裏須要注意的一個點就是因爲迴文數的位數可奇可偶,因此當它的長度是偶數時,它對摺過來應該是相等的;當它的長度是奇數時,那麼它對摺過來後,有一個的長度須要去掉一位數(除以 10 並取整)。

具體作法以下:

  • 每次進行取餘操做 ( %10),取出最低的數字:y = x % 10
  • 將最低的數字加到取出數的末尾:revertNum = revertNum * 10 + y
  • 每取一個最低位數字,x 都要自除以 10
  • 判斷 x 是否是小於 revertNum ,當它小於的時候,說明數字已經對半或者過半了
  • 最後,判斷奇偶數狀況:若是是偶數的話,revertNum 和 x 相等;若是是奇數的話,最中間的數字就在revertNum 的最低位上,將它除以 10 之後應該和 x 相等。

動畫描述

代碼實現

class Solution {
    public boolean isPalindrome(int x) {
        //思考:這裏你們能夠思考一下,爲何末尾爲 0 就能夠直接返回 false
        if (x < 0 || (x % 10 == 0 && x != 0)) return false;
        int revertedNumber = 0;
        while (x > revertedNumber) {
            revertedNumber = revertedNumber * 10 + x % 10;
            x /= 10;
        }
        return x == revertedNumber || x == revertedNumber / 10;
    }
}
複製代碼

End

致敬 LGD

相關文章
相關標籤/搜索