文|Seraph
01 | 问题
给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
示例 1:
输入: 123
输出: 321
示例 2:
输入: -123
输出: -321
示例 3:
输入: 120
输出: 21
02 |解题
初解:
整体思路还是很明显,就是利用除余10,来获取每位的具体数字,然后进行反转计算。
class Solution {
public:
int reverse(int x) {
if(x>-10 && x<10)
return x;
long result=0;
bool flag = x<0 ? 1:0;
int y;
int x1=abs(x);
do
{
y = x1%10;
result *= 10;
result += y;
}while(x1 /= 10);
if(flag)
result = -result;
if(result > INT_MAX || result < INT_MIN)
return 0;
return (int)result;
}
};
如上代码,发现又犯了整个while循环判断条件不能处理所有情况的,需要额外增加特殊边界处理的代码段。
终解:
如上发现的情况,经常会出现自己写do while语句,所以以后尽量按自己常用的while语句习惯写,就容易判断所有情况了。
同时,我们需要注意,如上代码虽然过了,但是使用了一个long型数据,按题的意思本不该支持大于32位以上整数的数据的。
可见如下:
class Solution {
public:
#define INT_MAX 2147483647
#define INT_MIN (-INT_MAX - 1)
int reverse(int x) {
int flag = 1;//设置正负指示
if (x < 0)
{
flag = -1;
x = -x;
}
int num = 0;
while (x > 0)
{
if ((num != 0 && (INT_MAX / abs(num) < 10)) || ((unsigned int)abs(num * 10) + (unsigned int)(x % 10) > INT_MAX))
{//溢出
return 0;
}
num = num * 10 + flag * (x % 10);
x = x / 10;
}
return num;
}
};
03 | 积累知识点
1 尽量考虑题目本应该受限的一些条件,因为我们编程使用的环境有时候确实不是我们能控制的,所以适应环境的编程方法还是很重要。
网友评论