反转整数

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


首页 我的博客
粤ICP备17103704号