Leetcode整数反转

  • 给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。

示例一

输入: 123
输出: 321

示例二

输入: -123
输出: -321

示例三

输入: 120
输出: 21

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

int reverse(int x){
    int rev = 0;

    while(x != 0){
        int pop = x % 10;

        if(rev > (pow(2, 31) - 1) / 10 || (rev == (pow(2, 31) - 1) / 10 && pop > 7)) return 0;
        if(rev < -1 * pow(2, 31) / 10 || (rev == -1 * pow(2, 31) / 10 && pop < -8)) return 0;

        x = x / 10;
        rev = rev * 10 + pop;
    }
    return rev;
}

这里主要考虑的是溢出条件:

设当前计算结果为rev,下一位为pop,最大值和最小值分别为max和min

  • rev * 10 + pop > max溢出时,有两种情况:一是出现rev > max / 10,此时无论pop是多少(这里的pop是正数),都会溢出;二是rev == max / 10 且pop > 7时,这里的7是2^31 - 1的个位数,也就是说,个位数最多是7。
  • rev * 10 + pop <min溢出时,也有两种情况:一是rev < min / 10,此时无论pop是多少(这里的pop是负数),都会溢出;二是rev == min / 10且pop < -8时,这里的8是2^31的个位数,也就是说,个位数最多是-8。
posted @ 2020-04-21 21:45  Crazy_Coding  阅读(69)  评论(0)    收藏  举报