7.整數(shù)反轉(zhuǎn)
題目
給出一個 32 位的有符號整數(shù)憨栽,你需要將這個整數(shù)中每位上的數(shù)字進行反轉(zhuǎn)院喜。
示例 1:
輸入: 123
輸出: 321
示例 2:
輸入: -123
輸出: -321
示例 3:
輸入: 120
輸出: 21
注意:
假設(shè)我們的環(huán)境只能存儲得下 32 位的有符號整數(shù)夺荒,則其數(shù)值范圍為 [?231 , 231 ? 1]下面。請根據(jù)這個假設(shè)虎眨,如果反轉(zhuǎn)后整數(shù)溢出那么就返回 0贤旷。
注意點
- 數(shù)字的翻轉(zhuǎn)并不難叮姑,比較容易出錯的是怎樣才能保證翻轉(zhuǎn)后的數(shù)組不能夠溢出唉地。
我的寫法
class Solution {
public int reverse(int x) {
boolean negative = false;//用一個布爾值來標(biāo)記該數(shù)值是否為負(fù)數(shù)
if(x < 0) {
x = Math.abs(x);
negative = true;
}//如果是負(fù)數(shù)變成正數(shù)并進行標(biāo)記
StringBuilder sb = new StringBuilder();
while(x > 0) {
sb.append(x % 10);
x /= 10;
}
long result = 0;
String sresult = sb.toString();
for(int i = 0; i < sresult.length(); i++) {
result = result * 10 + sresult.charAt(i) - '0';
}//整數(shù)的翻轉(zhuǎn),為了不溢出传透,用long類型來進行存儲
if(negative) {
result = - result;
return result < Integer.MIN_VALUE ? 0 : (int)result;
}else {
return result > Integer.MAX_VALUE ? 0 : (int)result;
}//返回前判斷是否溢出
}
}
官方題解
思路
- 翻轉(zhuǎn)數(shù)字的思路其實就是每次通過取余操作耘沼,獲得最低位,然后再把最低位*10變成我們需要的高位
- 邏輯如下:
//pop operation:
pop = x % 10;
x /= 10;
//push operation:
temp = rev * 10 + pop;
rev = temp;
- 那如何避免溢出這種情況呢朱盐?題目中要求如果溢出則返回0群嗤,官方提供的思路是,每次操作時托享,都要檢查下一次得到的rev是否會溢出骚烧。
- 檢查的思路如下所示:
為什么pop>7就會溢出呢,是因為INTMAX的值是2147483647
而(INTMAX/10)10=2147483640闰围,所以如果pop>7赃绊,則超過了INTMAX這時候就會發(fā)生溢出。
同理羡榴,(INTMIN/10)10=-2147483640碧查,如果pop<-8,則會發(fā)生溢出校仑。
代碼
class Solution {
public int reverse(int x) {
int rev = 0;
while(x != 0) {
int pop = x%10;
x/=10;
if(rev > Integer.MAX_VALUE/10 || (rev == Integer.MAX_VALUE/10 && pop > 7)) return 0;
if(rev < Integer.MIN_VALUE/10 || (rev == Integer.MIN_VALUE/10 && pop < -8)) return 0;
rev = rev * 10 + pop;
}
return rev;
}
}