给定一个 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就可以实现了。