LeetCode 7. 整数反转

题目描述

示例1:

输入: 123
输出: 321

示例2:

输入: -123
输出: -321

示例3:

输入: 120
输出: 21

注意:
假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 。请根据这个假设,如果反转后整数溢出那么就返回 0。

题解

这道题需要注意的是数据的范围,32为有符号数能够表示的最大数字为: 0x7fffffff(16) = 2147483647(10),最小数字为0x80000000(16) = -2147483648。因此在翻转后会出现溢出的情况。所以考虑先用long存储数据,然后在判断是否超过范围。在C++ 头文件中也预定义的这两个宏 INT_MAXINT_MIN

class Solution {
public:
    int reverse(int x) {
        long re = 0;
        while(x!=0){
            int t = x%10;
            long temp = 10*re + t;
            if(temp>INT_MAX||temp

反思

  1. 为什么32位有符号数中的负数要比正数绝对值大1?
    原因是计算机通过对符号数第一个位来判断数的正负。当第一位为1时为负,为0时为正。以4位(半个字节)为例,0111是能够表示的最大正数7。而通过将第一位取1后,看起来能取得最小负数是1111即为-7。但是,这样出现了正0(0000)和负0(1000)两种情况,浪费能够表示的范围。所以将负0表示能够表示的最大负数,即-7-1=-8。因此32位能表示的范围就如上面所述。

  2. 负数的取模
    取模是求余数的计算。满足公式:
    但是这样存在了一个问题,对于除法的不同定义,使得不同语言取模会出现不同的值。
    C++/Java:
    使用truncate除法,即将小于1的部分直接省去。
    -17 % 10 的计算结果如下:r = (-17) - (-17 / 10) x 10 = (-17) - (-1 x 10) = -7
    17 % -10 的计算结果如下:r = 17 - (17 / -10) x (-10) = (17) - (-1 x -10) = 7
    -17 % -10 的计算结果如下:r = (-17) - (-17 / -10) x (-10) = (-17) - (1 x -10) = -7
    Python:
    使用floor除法,即取不超过结果的整数。
    -17 % 10 的计算结果如下:r = (-17) - (-17 //10) x 10 = (-17) - (-2 x 10) = 3
    17 % -10 的计算结果如下:r = 17 - (17 //-10) x (-10) = (17) - (-2 x -10) = -3
    -17 % -10 的计算结果如下:r = (-17) - (-17 // -10) x (-10) = (-17) - (1 x -10) = -7

你可能感兴趣的:(LeetCode 7. 整数反转)