LeedCode刷题笔记:整数反转
题目描述
给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
注意:
假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−2^31, 2^31 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。
示例 1:
输入:x = 123
输出:321
示例 2:
输入:x = -123
输出:-321
示例 3:
输入:x = 120
输出:21
示例 4:
输入:x = 0
输出:0
提示:
-231 <= x <= 231 - 1
解题代码
class Solution {
public:
int times = 0;
int reverse(int x)
{
int ret = 0;
int x_back = x;
long temp = 0, sum = 0;
while(x != 0)
{
temp = x % 10;
sum = sum * 10 + temp;
x /= 10;
}
if(sum <= pow(2, 31) - 1 && sum >= pow(-2,31))
{
ret = sum;
}
else
{
ret = 0;
}
return ret;
}
};
总结
- 整个逻辑是很清晰的,就是逐步获取输入数字的最后一位,然后附加在输出数字身上,用的是
sum = sum * 10 + temp
- 这里主要是对于越界结果的判断,也就是怎么获取一个最大最小的32位有符号数字,主要方法有三种
- 计算使用
min = pow(-2, 31); max = pow(2, 31) -1;
- 使用库函数,
#include <limits.h> int min = INT_MIN, max = INT_MAX;
- 使用c语言有符号数字的存储特点计算得到,
max = (-1)>>1;
min = -max -1;
- C语言的有符号数字存储,0表示正数,1表示负数,1000 0000 0000 0001,取反码再加1之后为 1111 1111 1111 1111,也就是-1的有符号数字的二进制表示(这里假设只有16位存储)
- 计算使用