LeetCode打卡14 回文數

2021-08-21 04:58:36 字數 1486 閱讀 8985

leetcod 打卡14

回文數
看一下今天的題目:

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

示例 1:

輸入: 121

輸出: true

示例 2:

輸入: -121

輸出: false

解釋: 從左向右讀, 為 -121 。 從右向左讀, 為 121- 。因此它不是乙個回文數。

示例 3:

輸入: 10

輸出: false

解釋: 從右向左讀, 為 01 。因此它不是乙個回文數。

思路:我想到的是將整數轉為字元再加以判斷,這樣解決並不難(在想象中)但是在參考了官方給出的思路時,感覺這個思路太low了。

官方思路:

將數字本身反轉,然後將反轉後的數字與原始數字進行比較,如果它們是相同的,那麼這個數字就是回文。 但是,如果反轉後的數字大於 int.max,我們將遇到整數溢位問題。

按照第二個想法,為了避免數字反轉可能導致的溢位問題,為什麼不考慮只反轉 int 數字的一半?畢竟,如果該數字是回文,其後半部分反轉後應該與原始數字的前半部分相同。

例如,輸入 1221,我們可以將數字「1221」的後半部分從「21」反轉為「12」,並將其與前半部分「12」進行比較,因為二者相同,我們得知數字 1221 是回文。

演算法:首先,我們應該處理一些臨界情況。所有負數都不可能是回文,例如:-123 不是回文,因為 - 不等於 3。所以我們可以對所有負數返回 false。

現在,讓我們來考慮如何反轉後半部分的數字。 對於數字 1221,如果執行 1221 % 10,我們將得到最後一位數字 1,要得到倒數第二位數字,我們可以先通過除以 10 把最後一位數字從 1221 中移除,1221 / 10 = 122,再求出上一步結果除以10的餘數,122 % 10 = 2,就可以得到倒數第二位數字。如果我們把最後一位數字乘以10,再加上倒數第二位數字,1 * 10 + 2 = 12,就得到了我們想要的反轉後的數字。 如果繼續這個過程,我們將得到更多位數的反轉數字。

現在的問題是,我們如何知道反轉數字的位數已經達到原始數字位數的一半?

我們將原始數字除以 10,然後給反轉後的數字乘上 10,所以,當原始數字小於反轉後的數字時,就意味著我們已經處理了一半位數的數字。

public

boolean

ispalindrome

(int x)

int revertednumber = 0;

while(x > revertednumber) 

return x == revertednumber || x == revertednumber/10;

}

感想:雖然這道題的思想,不算難,但是要想到也是不容易的。

尋志同道合之同志,共同進步:

藍橋 ALGO 14 回文數

acm模版 模擬題,直接模擬這個過程不斷判定即可。需要注意的是最後位數可能比較大,因為每一次相加都可以粗略看做 2 而最多三十步,最後資料的大小可能超乎你的想象。一開始我陣列只開了幾十,wa 了一組資料,然後開到了 100 ac 了 include include using namespace s...

leetcode題目9 回文數

判斷乙個整數是否是回文數。回文數是指正序 從左向右 和倒序 從右向左 讀都是一樣的整數。示例 輸入 121 輸出 true解法一 數字轉字串 class solution def ispalindrome self,x type x int rtype bool if x 0 return fals...

LeetCode筆記 9 回文數

給你乙個整數 x 如果 x 是乙個回文整數,返回 true 否則,返回 false 回文數是指正序 從左向右 和倒序 從右向左 讀都是一樣的整數。例如,121 是回文,而 123 不是。示例 1 輸入 x 121輸出 true 示例 2 輸入 x 121 輸出 false 解釋 從左向右讀,為 12...