力扣leetcode题目分析——整数反转

题目

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

输入: 123
输出: 321

输入: -123
输出: -321

输入: 120
输出: 21

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

链接

https://leetcode-cn.com/problems/reverse-integer/

运行环境

java语言

思路

原谅我没有看到溢出错误这里,我只看到反转就直接动手了。
反转这一块的思路就是先把数按照个十百千这种顺序拿出来,怎么拿出来呢?我记得我最开始学C语言的时候就遇到这种需要一位一位拿出来的题,就是用除法和取余,两个交替使用就能得到每一位,%10就能得到个位,再把原来的数去/10就能减少一位,再取余又得到百位,以此类推,一直到取余之后得到0,说明以及到达最高位了。每一位拿出来后怎么办呢?我们发现个位变成了最高位,但是最高位到底是几位呢?总不能去算几位吧,这样用的时间就太长了,以最高位为例,每次除以10之后都少了一位,这是我们让最低位乘10,那么当最高位变成最低位的时候,最低位也就变成了最高位。所以可以用下面的代码来实现

代码1(错误)

class Solution {
    public int reverse(int x) {
        int temp=0;
        while(x!=0){
            temp=temp*10+x%10;
            x/=10;
        }
        return temp;
    }
}

结果怎么样呢?结果当然是错误的。不是分析有错误,是因为没有考虑到溢出的问题。2^31-1=2147483647,如果给我们的就是这个数怎么办,反转之后变成7463847421吗?不是,因为这个时候已经超出了int的范围了,已经溢出了,所以不会给出正确答案。看下面的补充思路。

补充思路

如果已经溢出了,那么int肯定装不下了,所以改用long来装反转后的数,然后再来判断有没有超出int的范围,如果溢出了,就返回0,否则就强制类型转换为int型返回。在Integer包装类中提供了两个静态常量值作为int的最小范围以及最大范围,分别为MIN_VALUE和MAX_VALUE。

代码2

class Solution {
    public int reverse(int x) {
        long temp=0;
        while(x!=0){
            temp=temp*10+x%10;
            x/=10;
        }
        if(temp<Integer.MIN_VALUE || temp>Integer.MAX_VALUE)
            return 0;
        return (int)temp;
    }
}

结果

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值