題設(shè)
Reverse digits of an integer.
Example1: x = 123, return 321
Example2: x = -123, return -321
要點(diǎn)
- 32位補(bǔ)碼缚态,-2147483648---2147483647磁椒,正轉(zhuǎn)負(fù)注意判斷溢出
- 轉(zhuǎn)換過(guò)程中,也要注意溢出
思路比較簡(jiǎn)單玫芦,首先把負(fù)數(shù)轉(zhuǎn)化為正數(shù)處理浆熔,假設(shè)轉(zhuǎn)化為正數(shù)后為x。
但是桥帆!這里要注意医增,32位整數(shù)的范圍是-2147483648---2147483647,所以在取反前要判斷負(fù)數(shù)是不是-2147483648,是的話肯定會(huì)溢出老虫,返回0叶骨!
轉(zhuǎn)化為正數(shù)后,有:result = (result + x % 10) * 10祈匙,x = x / 10忽刽。result初始為0。循環(huán)到x / 10<10夺欲,再加上最后的個(gè)位數(shù)x即可跪帝。
那么如何判斷溢出呢?在更新result之前些阅,我們可以記錄一個(gè)lastResult = result + x % 10歉甚。這樣,如果更新完后的result / 10 != lastResult扑眉,則發(fā)生了溢出纸泄。即:
lastResult = result + x % 10;
result = (result + x % 10 ) * 10;
if(lastResult != result / 10)
return 0;
public static int reverse(int x){
if(x == -2147483648) // 32位整數(shù)范圍是-2147483648---2147483647,所以如果輸入的是-2147483648腰素,一取反就溢出了
return 0;
int flag = 0; // 是否為負(fù)數(shù)
int value = x;
if(x < 0){
flag = 1;
value = -value; // 負(fù)數(shù)轉(zhuǎn)化為正數(shù)處理
}
int result = 0;
int lastResult = 0; //result乘上10后再除以10聘裁,判斷是否和之前相等。如果不相等則溢出了
while(value >= 10){
int tail = value % 10;
lastResult = result + tail;
result = (result + tail) * 10;
if(result / 10 != lastResult) // 溢出
return 0;
value /= 10;
}
if(flag == 0)
return result + value;
else
return -(result + value);
}