描述#
示例 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 就可以了,过程真的简化了好多好多
- 自己的定式思维在没有直接对比时真的完全意识不到有多少学习,这道题算是没有白做,学到了很多