LeetCode 7:整数反转
int reverse(int x){
int result = 0;
unsigned int y; //x的绝对值
unsigned long long temp = 0; //存y反转后的值
if(x > -2147483648) {
y = abs(x);
}
else {
y = 2147483648;
}
while(y != 0) {
temp = temp * 10 + y % 10;
y /= 10;
}
if(x < 0 && temp <= 2147483648) {
result = -temp;
}
else if(x >= 0 && temp < 2147483648) {
result = temp;
}
else {
/* do nothing */
}
return result;
}
这道题主要是三步:
一、求绝对值
这块有个坑就是abs()函数,第一次提交直接用的y = abs(x),然后发现当x = -2147483648会出错;
查了一下函数库abs的定义是extern int abs(int x);也就是说它返回的是一个int类型[-2147483648, 2147483647]
在GCC下打印输出abs(-2147483648),发现会返回整数本身,所以增加了一个判断(这个坑以前是真的没有注意过,看来在使用库函数的时候还是要注意一下函数的返回值类型)
if(x > -2147483648) {
y = abs(x);
}
else {
y = 2147483648;
}
二、反转整数
反转整数的核心算法如下:
参照位运算的思想,将temp左移一位(注意这里是十进制),然后将y当前的最低位加到temp的最低位上,然后移除y的最低位,循环直到y == 0。
temp = 0;
while(y != 0) {
temp = temp * 10 + y % 10;
y /= 10;
}
三、溢出判断
result = 0;
if(x < 0 && temp <= 2147483648) {
result = -temp;
}
else if(x >= 0 && temp < 2147483648) {
result = temp;
}
else {
/* do nothing */
}