回文數(整數)與整數反轉

2021-10-04 18:17:16 字數 2091 閱讀 8730

映入腦海的第乙個想法是將數字轉換為字串,並檢查字串是否為回文。但是,這需要額外的非常量空間來建立問題描述中所不允許的字串。

第二個想法是將數字本身反轉,然後將反轉後的數字與原始數字進行比較,如果它們是相同的,那麼這個數字就是回文。

但是,如果反轉後的數字大於 int.max\textint.max,我們將遇到整數溢位問題。

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

例如,輸入 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,所以,當原始數字小於反轉後的數字時,就意味著我們已經處理了一半位數的數字。

class solution 

// if(x == rev) return true;

// else return false;

// }

// }

// 特殊情況:

// 如上所述,當 x < 0 時,x 不是回文數。

// 同樣地,如果數字的最後一位是 0,為了使該數字為回文,

// 則其第一位數字也應該是 0

// 只有 0 滿足這一屬性

if(x < 0 || (x % 10 == 0 && x != 0))

int revertednumber = 0;

while(x > revertednumber)

// 當數字長度為奇數時,我們可以通過 revertednumber/10 去除處於中位的數字。

// 例如,當輸入為 12321 時,在 while 迴圈的末尾我們可以得到 x = 12,revertednumber = 123,

// 由於處於中位的數字不影響回文(它總是與自己相等),所以我們可以簡單地將其去除。

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

}};

反轉整數的方法可以與反轉字串進行模擬。我們想重複「彈出」 x 的最後一位數字,並將它「推入」到 rev 的後面。最後,rev 將與 x相反。要在沒有輔助堆疊與陣列的幫助下 「彈出」 和 「推入」 數字,我們可以使用數學方法。

//pop operation:

pop = x % 10;

x /= 10;

//push operation:

temp = rev * 10 + pop;

rev = temp;

但是,這種方法很危險,因為當 temp=rev⋅10+pop 時會導致溢位。幸運的是,事先檢查這個語句是否會導致溢位很容易。為了便於解釋,我們假設 rev是正數。如果 temp=rev⋅10+pop導致溢位,那麼一定有 rev≥int_max/10​。如果 rev>int_max/10​,那麼 temp=rev⋅10+pop 一定會溢位。如果 rev==int_max/10​​,那麼只要 pop>7,temp=rev⋅10+pop就會溢位。當 rev為負時可以應用類似的邏輯。

class solution 

return rev;

}};

7 整數反轉 9 回文數

兩題放一起是因為9有乙個高階要求,用7可以解決這個高階要求。故二者在一定上有相同解決思路,於是可以一起進行學習。7.整數反轉給出乙個 32 位的有符號整數,你需要將這個整數中每位上的數字進行反轉。示例 1 輸入 123 輸出 321 示例 2 輸入 123 輸出 321 示例 3 輸入 120 輸出...

Leetcode 02 09 整數反轉 回文數

題目描述 給出乙個 32 位的有符號整數,你需要將這個整數中每位上的數字進行反轉。首先,拿到這道題之後,先審題。有符號的數字需要考慮負數的情況,所以最好先判斷以下正負。每乙個數字反轉,可以先把每一位的數字取出來,然後再利用數學的方法構造出來反轉後的整數。以乙個三位數345為例,如果想要把5取出來,3...

判斷整數是否為回文數

判斷乙個整數是否是回文數。回文數是指正序 從左向右 和倒序 從右向左 讀都是一樣的整數。示例 1 輸入 121 輸出 true 示例 2 輸入 121 輸出 false 解釋 從左向右讀,為 121 從右向左讀,為 121 因此它不是乙個回文數。示例 3 輸入 10 輸出 false 解釋 從右向左...