整数反转

题目

给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。
如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1] ,就返回 0。
假设环境不允许存储 64 位整数(有符号或无符号)。

示例 1:

输入:x = 123
输出:321

示例 2:

输入:x = -123
输出:-321

示例 3:

输入:x = 120
输出:21

示例 4:

输入:x = 0
输出:0

提示:

-231<= x <= 231- 1

题解

思路:
假设该数为x:
一、写出反转数

1、初始化x的反转整数rev=0;

2、逐次从x取出末尾数字,直至x为0

  • digit=x%10;   //整数x最后一位:x%10;
  • x/10;     //去除x的最后一位:

3、将取出的数字逐次放入到反转数rev数中

  • rev*10+digit;  //保存反转后的数据

二、判断反转数是否超过有效范围

1、在「推入」数字之前,判断是否满足

  • −231≤rev⋅10+digit≤231−1
    成立保存并输出
    不成立则返回 0

2、但不允许使用 64位整数,需在 32位有符号整数的范围内考虑
在这里插入图片描述在这里插入图片描述
在这里插入图片描述

代码:

class Solution {
    public int reverse(int x) {
       int rev=0;
       while(x!=0){
       //判断反转数是否越界
  		if(rev>Integer.MAX_VALUE/10||rev<Integer.MIN_VALUE/10){
               return 0;
            }
            //每次取末尾数字
            int digit=x%10;
            x/=10;
            //保存反转数
            rev=rev*10+digit;
        }
       return rev;
    }
}

  不用判断 (rev== 214748364 && tmp>7) 和 (rev==-214748364 && tmp<-8) 的,原因如下:

  • 输入x的范围为 [−2^31, 2^31 − 1] = [-2147483648, 2147483647]
  • 反转后的值 rev 要想越界,则必定也是10位数字组成(不考虑符号位)
  • rev越界存在两种情况:
    • case1: rev前9位中的第 m 位大于 214748364 的对应位,且第1~(m-1)位都与214748364 的对应位相等
    • case2: rev前9位就是214748364,最后一位为8或者9(这也就是 (rev== 214748364&&tmp>7) 和(rev==-214748364 && tmp<-8))。但这是不可能的:因为这种情况下,x本身就已经越界了。

  原数是int类型数,int最大值和最小值的最高位是2。如果一个原数与int类型数的最大值或最小值的长度相等,那么这个数的最高位数也只能为1或2,那么它对应反数的最后一位也只能为1或2。int最大值的最后一位数为7,1或2肯定小于7;int最小值的最后一位数为-8, -1,-2肯定大于-8。

复杂度分析

  • 时间复杂度:O(log⁡∣x∣)。翻转的次数即 x 十进制的位数。
  • 空间复杂度:O(1)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值