1.算法題目
給出一個(gè) 32 位的有符號(hào)整數(shù),你需要將這個(gè)整數(shù)中每位上的數(shù)字進(jìn)行反轉(zhuǎn)。
示例 1:
輸入: 123
輸出: 321
示例 2:
輸入: -123
輸出: -321
示例 3:
輸入: 120
輸出: 21
注意:
假設(shè)我們的環(huán)境只能存儲(chǔ)得下 32 位的有符號(hào)整數(shù),則其數(shù)值范圍為[?2^31, 2^31? 1]。請(qǐng)根據(jù)這個(gè)假設(shè),如果反轉(zhuǎn)后整數(shù)溢出那么就返回 0。
2.算法思路
算法總思路是彈出末位和推入數(shù)字 & 溢出前進(jìn)行檢查,具體步驟:
- 依次構(gòu)建反轉(zhuǎn)整數(shù)的一位數(shù)字;
- 檢查當(dāng)前反轉(zhuǎn)得到的數(shù)字再增加一位數(shù)字后是否會(huì)越界,為什么要在變換前進(jìn)行越界檢查呢?因?yàn)槿绻崔D(zhuǎn)后的數(shù)字越界越界了,再去判斷的時(shí)候數(shù)字已經(jīng)被截取了,判斷結(jié)果不準(zhǔn)確了;越界判斷依據(jù)以正數(shù)為例:若 temp = vev * 10 + pop > Integer.MAX_VALUE 溢出了,則一定有 rev >= (Integer.MAX_VALUE / 10),若 rev > (Integer.MAX_VALUE / 10),則 temp = vev * 10 + pop 一定會(huì)溢出;若 rev == (Integer.MAX_VALUE / 10),只要 pop > 7,則 temp = vev * 10 + pop 會(huì)溢出;負(fù)數(shù)的判斷依據(jù)也可以依次類推;
- 推入數(shù)字的時(shí)候借助數(shù)學(xué)方法做變換 rev = rev * 10 + pop。
3.算法代碼
依據(jù)算法思路用Java語(yǔ)言編寫(xiě)的具體算法代碼如下:
/**
* 要考慮反轉(zhuǎn)后整數(shù)溢出情況:溢出后返回0
* @param x
* @return
*/
public static int reverse(int x) {
int res = 0;
int maxOneTenth = Integer.MAX_VALUE / 10;
int minOneTenth = Integer.MIN_VALUE / 10;
while (x != 0) {
int pop = x % 10;
x = x / 10;
if (res > maxOneTenth || (res == maxOneTenth && pop > 7)) {
return 0;
}
if (res < minOneTenth || (res == minOneTenth && pop < -8)) {
return 0;
}
res = res * 10 + pop;
}
return res;
}
4.總結(jié)
這個(gè)算法題重點(diǎn)是要掌握對(duì)反轉(zhuǎn)后數(shù)據(jù)的越界檢查時(shí)機(jī)和判斷方法。
??如果你有疑問(wèn)或更好的算法思路,歡迎留言交流!?。?/strong>
??如果感覺(jué)我的文章對(duì)您有所幫助,麻煩動(dòng)動(dòng)小手給個(gè)喜歡,謝謝?。?!