描述#
示例 1:
輸入: 123
輸出: 321
示例 2:
輸入: -123
輸出: -321
示例 3:
輸入: 120
輸出: 21
注意:
假設我們的環境只能存儲得下 32 位的有符號整數,則其數值範圍為 [−231, 231 − 1]。請根據這個假設,如果反轉後整數溢出那麼就返回 0。
思路#
- 提取正負號
- 轉化為正數後提取每一位數
- 倒序將提取出的數賦值相加
- 溢出判斷
int reverse(int x){
char sign = 1,nums = 0,value[10] = {0};
int final = 0;
long final_long = 0;
//符號提取,數字提取
if(x < 0) {
if(x == -2147483648)//-2^31,溢出無法轉化正數,且反轉後溢出
return 0;
else
x = -x;
sign = -1;
}
//獲取x位數
for(;x;nums++) {
value[nums] = x % 10;
x = x / 10;
}
for(int i=0;nums > 0;nums--) {
final_long += value[i++];
if(nums > 1)//還有下一位
final_long *= 10;
}
final = (int)final_long;
if(final == final_long)
return final * sign;
else
return 0;
}
注意#
- 錯誤檢查一個是能否轉化為合格正數,一個是反轉後是否發生溢出
------------------------------------------- 分割線!!!!-------------------------------------------------------
更新#
在網上看到一些其他人的解法,醍醐灌頂,直接可以將上述代碼簡化很多很多,直接上代碼:
int reverse(int x){
int final = 0;
long final_long = 0;
while(x) {
final_long = final_long * 10 + x % 10;
x = x / 10;
}
final = (int)final_long;
if(final == final_long)
return final;
else
return 0;
}
- 原本的提取正負號,其實根本沒有必要,因為正數和負數在運算過程中,唯一不同的就是取餘的最後一位,負數最後一位的取餘是帶著正負號的,所以直接算就可以了,自己還是思維比較死板啊,想當然地多此一舉
- 最終結果的計算和取餘的過程可以合在一起,我之前總是紛結於要得到整數的位數,才能繼續計算,其實就像上面一樣,取一次餘繼續 ×10 就可以了,過程真的簡化了好多好多
- 自己的定式思維在沒有直接對比時真的完全意識不到有多少學習,這道題算是沒有白做,學到了很多