给定一个 32 位有符号整数,将整数中的数字进行反转。
示例 1: 输入: 123输出: 321 示例 2: 输入: -123输出: -321 示例 3: 输入: 120输出: 21
注意:
假设我们的环境只能存储 32 位有符号整数,其数值范围是 [−231, 231 − 1]。根据这个假设,如果反转后的整数溢出,则返回 0。
public int Reverse(int x) {
int sign = (x < 0)?-1:1;//取符号啦
//转为负数来处理,因为abs后负数的范围比正数大1,转整数就有可能溢出啦
x *= -sign;
int temp = x;
Int64 tempRes = 0;//用一个更大范围的来计算结果和判断
//计算最大值偏移,负数的范围大1,正数的话就0
int offset = (int)Math.Round(sign/2f-0.5f);
while(x < 0)
{
temp = x % 10;
tempRes = tempRes * 10 + temp;
//判断是否溢出,加上偏移
if(tempRes < -int.MaxValue + offset) return 0;
x /= 10;
}
//前面有溢出判断了,这里大胆转,并进行原符号的恢复
return (int)tempRes * -sign;
}-1代表负数,1代表正数,同一转化为abs后范围比较大的负数(乘于-sign,事后再乘于-sign就可以恢复符号),范围判断时,使用-int.MaxValue进行判断,需要注意负数的范围时比它小一的,整数不变,所以需要将符号sign映射出一个偏移offset来,通过简单的除2减0.5就可以实现了。