# Leetcode 程式碼解釋 1. Palindrome ``` class Solution: def isPalindrome(self, x: int) -> bool: if x < 0: return False reversed_num = 0 temp = x while temp != 0: digit = temp % 10 reversed_num = reversed_num * 10 + digit temp //= 10 return reversed_num == x ``` 詳細解釋:數字倒序的重建邏輯 核心邏輯 要將數字倒序,可以將數字的每一位逐步取出並組合到新的數字中,而這段程式碼使用了「十進位制」的特性來實現這個操作。具體來說: 1. 利用取模(%)提取數字的最後一位: - 取模運算 x % 10 用於提取數字 x 的個位數。 - 例如:123 % 10 = 3,這樣我們可以獲得最後一位數。 2. 逐步構建倒序數字: - 倒序的數字需要將每一位數從最低位組裝到最高位。例如: - 正序 123,倒序 321。 - 3 是倒序的最高位,2 是倒數第二位,1 是倒數第三位。 - 利用公式: reversed_num = reversed_num * 10 + digit - reversed_num * 10 的作用:將當前數字的所有位數往左移一位(數字變大 10 倍)。 - + digit 的作用:將新提取的一位數組裝到最右邊。 - 這樣,每次迴圈都將倒序數字擴展一位。 3. 去掉原數的最後一位(整數除法 //): - x 被逐步縮小,去掉已提取的位數。 - 例如,x = 123,取出 3 後,更新為 x = 123 // 10 = 12。 具體例子解析 假設輸入數字 x = 123,執行過程如下: 1. 初始狀態: - reversed_num = 0,temp = 123。 2. 第一次迴圈: - digit = 123 % 10 = 3 - reversed_num = 0 * 10 + 3 = 3 - temp = 123 // 10 = 12 3. 第二次迴圈: - digit = 12 % 10 = 2 - reversed_num = 3 * 10 + 2 = 32 - temp = 12 // 10 = 1 4. 第三次迴圈: - digit = 1 % 10 = 1 - reversed_num = 32 * 10 + 1 = 321 - temp = 1 // 10 = 0 5. 迴圈結束: - temp = 0,停止。 - 最終 reversed_num = 321。 為何要乘以 10? 乘以 10 是為了確保新加入的位數放置到正確的位置。例如: - 32 是已重建的部分,如果不乘以 10,加入 1 時會變成 32 + 1 = 33,而不是 321。 - 32 * 10 = 320,這樣才能正確加上 1,得到 321。 這種操作基於十進位制的規則,每位數的權重是 10 的次方,從右到左依次是 10^0, 10^1, 10^2,因此新位數進入時,需要將現有數字左移一位(乘以 10)。 程式正確性與邊界情況 1. 負數的處理: - 如果 x < 0,直接返回 False。 - 原因是負數的倒序會改變負號的位置,例如 -121 倒序後變成 121-,顯然不可能是回文。 2. 特殊值(邊界值): - x = 0:倒序後仍是 0,結果為 True。 - 單位數 x = 7:倒序後仍是 7,結果為 True。 3. 大數問題: - Python 支援任意大數,因此不會有整數溢出的情況。如果在其他語言中(如 C++),需要特別注意數字過大導致溢出的問題。 迴圈的數學直觀 迴圈執行的次數與數字的位數 n 成正比。以下是數學直觀的解釋: 1. 迴圈次數: - 每次迴圈取出數字的最後一位並去掉它,因此執行 n 次後,數字會被完全處理。 - 例如,x = 12345,需要 5 次迴圈來處理 5 位數字。 2. 每次迴圈的操作: - % 10:提取數字的末位。 - * 10:將倒序數字左移一位。 - // 10:去掉原數的末位。 - 這種操作的順序與數字逐位拆解和組裝的邏輯完全一致。 總結 數字倒序邏輯的核心: - 利用十進位制的「位數權重」,通過乘以 10 和加上新位數,逐步構建倒序數字。 難點: - 初學者可能需要理解「為何要乘以 10」以及如何在數字拆解過程中保持原數不變。 邊界條件: - 負數、單位數和零都需特殊處理。 - 在 Python 中不用擔心整數溢出問題,但其他語言需要注意。