解题思路
- 由于是带符号整数,所以为了统一处理过程先取得参数x的符号位,记为flag;
- 如果x是正数则flag = 1, 如果x位负数则flag = -1, 同时将x取绝对值(x = -x);
- 通过将取x的余数将reverse的值从0开始不断增大:
reverse = reverse*10 + x%10;
;
通过取商不断将参数x的值缩小:x /= 10;
x为0时结束循环
- 边界判断:由于参数x反转后的值可能溢出,所以在每次将reverse增大后都要对reverse的值进行判断:如果当前reverse的值已经大于等于INT_MAX/10了,且参数x此时的值大于INT_MAX最后一位的值,则反转后的x必溢出,此时可直接返回0; 否则继续循环
- 循环结束表明x反转后的值未溢出,直接返回reverse与符号位flag的乘积即可。
代码
class Solution {
public:
/**
*
* @param x int整型
* @return int整型
*/
int reverse(int x) {
int flag;
if(x > 0)
flag = 1;
else {
flag = -1;
x = -x;
}
int reverse = 0;
while(x > 0) {
reverse = reverse*10 + x%10;
// 边界条件判断
if(reverse >= INT_MAX/10 && x > INT_MAX%10)
return 0;
x /= 10;
}
return flag*reverse;
}
};
复杂度分析
- 时间复杂度:O(logn),每次都将x除以10,x循环到0的次数为:以10为底x的对数。
- 空间复杂度:O(1)