领扣刷题 leetcode 07

7.整数反转

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

  • 示例 1:
    • 输入: 123
    • 输出: 321
  • 示例 2:
    • 输入: -123
    • 输出: -321
  • 示例 3:
    • 输入: 120
    • 输出: 21

      注意:

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

这是我第一次没有看评论写出来的,当然,没有通过测试

    #include
    int reverse(int x);
    int main(){
        printf("%d", reverse(-2147483648));
        return 0;
    }
    //-2147483648~2147483647 10位
    int reverse(int x){
        int b[10] = {2, 1, 4, 7, 4, 8, 3, 6, 4, 7}; //这是大于0情况的
        int a[10] = {0};//初始化,不然当x=0是会出现bug
        int ifPositive = 1;//这个参数是为了记录该数为正或为负
        int result = 0;
        printf("%d\n", x);
        if (x < 0){
            x=-x;
            ifPositive = 0;
        }
        printf("%d\n",x);
        int i = 0;
    
        while (x){ //x不为0
            a[i] = x % 10;
            x /= 10;
            i++;
        } //出来后i的最大值为10
        if (i == 10){ //不要判断溢出
            printf("判断溢出\n");
            for(int j=0;j<10;j++)
                printf("a[%d]:%d\n",j,a[j]);
            int j = 0;
            for (; j < 9; j++){ //比较除个位以外的数
                if (a[j] == b[j]){ //相同,继续循环判断
                    printf("continue:%d\n",j);
                    continue;
                }
                else if (a[j] > b[j]){ //异常 返回
                    printf("return:%d\n", j);
                     return 0;
                }
                else{ //出现一次即代表 可以跳出循环
                    printf("break:%d\n", j);
                     break;
                }
            }
            if (j == 9){ //继续判断
                if (a[9] > b[9] - ifPositive){
                    return 0;
                }
            }
        }
    
        result = a[0];
        for (int j = 1; j < i; j++)
        {
            result *= 10;
            result += a[j];
        }
    
        return ifPositive ? result : -result;
    }

在调试过程中我发现测试内容有一个为x=-2147483648,终于知道了为什么无法通过测试,当为32位int时,-2147483648转为正数也会因为溢出变为2147483647(正向最大)+1=-2147483648,但是我也不知道这应该怎么解决,有大佬啊知道的话请带带我

看了官方的解法我感觉我还是太菜了

手动转下c语言
    int reverse(int x) {
        int rev = 0;
        while (x != 0) {
            int pop = x % 10;//没啥好说的
            x /= 10;//没啥好说的
            if (rev > INT_MAX/10 || (rev == INT_MAX / 10 && pop > 7)) return 0;
            if (rev < INT_MIN/10 || (rev == INT_MIN / 10 && pop < -8)) return 0;//这里这个pop判断很有灵性.
            rev = rev * 10 + pop;
        }
        return rev;
    }

复习一下c语言负数取余的知识

嗯 比如-7%3=-1 就是 -7+3+3=-1

然后写一句提醒自己,这不是汇编,把数字拆分成数组并不会提升速度(我也不太清楚,反正这样写很麻烦,大概性能提升也不明显),可我就是个强迫症......,反正下次不这样写了

嘛 感觉官方这个算法很神秘,我可能一时半会想不出来,时间复杂度是O(log(x)) 空间复杂度是O(1)

先自己写一遍看看 第二轮做的时候先复习8

转载于:https://www.cnblogs.com/WuLiaoTC/p/10321361.html

你可能感兴趣的:(领扣刷题 leetcode 07)