給出一個(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ù)值范圍為 [?231, 231 ? 1]佣蓉。請(qǐng)根據(jù)這個(gè)假設(shè),如果反轉(zhuǎn)后整數(shù)溢出那么就返回 0亲雪。
來(lái)源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/reverse-integer
著作權(quán)歸領(lǐng)扣網(wǎng)絡(luò)所有勇凭。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系官方授權(quán),非商業(yè)轉(zhuǎn)載請(qǐng)注明出處义辕。
解題思路:
不允許新建棧虾标、和數(shù)組的情況下,可以用數(shù)學(xué)的方式來(lái)解決灌砖,我們可以定義一個(gè)變量璧函,原值操作一個(gè),變量跟著做相應(yīng)操作基显,
通過(guò)循環(huán)將數(shù)字x的每一位拆開(kāi)柳譬,原值除以10,變量乘以10续镇,如下
//整數(shù)反轉(zhuǎn)
class Solution {
public int reverse(int x) {
int result=0;
while(x != 0){
//整除之后的余數(shù)
int pop=x%10;
result=result*10+pop;
x=x/10;
}
return result;
}
}
但是上述情況會(huì)有例外,當(dāng)原值不大于int類型最大時(shí)销部,最終反過(guò)來(lái)的值可能會(huì)大于最大摸航,溢出了,所以要加溢出條件(大于最大(MAX_VALUE) | | 小于最小(MIN_VALUE))舅桩,判斷最終結(jié)果 =result10+pop;的范圍酱虎,
1.大于最大 (當(dāng)result*10+pop>MAX_VALUE)
1,當(dāng)result>MAX_VALUE/10 還有pop需要添加 則必然不符合條件溢出
2擂涛,當(dāng)ans == MAX_VALUE / 10 且 pop > 7 時(shí)读串,則一定溢出,7是2^31 - 1的個(gè)位數(shù)
2.小于最小 (當(dāng)result*10+pop<MIN_VALUE)
1,當(dāng)result<MIN_VALUE/10 還有pop需要添加 則必然不符合條件溢出
2恢暖,當(dāng)ans == MIN_VALUE / 10 且 pop < -8 時(shí)排监,則一定溢出,8是-2^31的個(gè)位數(shù)
最終代碼:
class Solution {
public int reverse(int x) {
int result = 0;
while (x != 0) {
int pop = x % 10;
if (result > Integer.MAX_VALUE / 10 || (result == Integer.MAX_VALUE / 10 && pop > 7))
return 0;
if (result < Integer.MIN_VALUE / 10 || (result == Integer.MIN_VALUE / 10 && pop < -8))
return 0;
ans = result * 10 + pop;
x /= 10;
}
return result;
}
}
每天一算法杰捂,成功有方法舆床。堅(jiān)持!<藜选挨队!
原文地址