回文數是指正序(從左到右)讀和倒序(從右到左)讀都是一樣的整數。
比如形如 121,1221,13531 的數字都是回文數,但 -121,10,25 等等都不是回文數。
如何判斷一個數是回文數?這是一個很簡單的算法,最常見的實現方式是使用一個棧或其他方法,把數字序列逆序,然后判斷逆序后的數字是否等於原先的數字。顯然這種實現方式需要至少 n 次循環才能完成判斷。
本文提供一種更巧妙的方法,利用回文數的特點,只需要循環 \(\frac{n}{2}\) 次就可以完成判斷了,代碼及注釋如下:
bool isPalindrome(int x)
{
// 負數的第一位帶有負號'-',所以一定不是回文數
// 長度超過一位的數字,第一位肯定不是 0,因此末尾是 0,則一定不是回文數
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;
}