【每日一题】整数反转

题目描述:
在这里插入图片描述
输入输出实例:
在这里插入图片描述

思路:
题目中说的是整数的反转,我们可以很自然的想到stack和stringBuild来实现整数的反转,先将整数转化为字符串,然后对字符串进行操作,实现字符串的反转,最后在进行判断。
需要注意的是,题中提示假设环境只能存储32位的整数,所以不能利用long来存储大于int最大值的整数,当然用int存的话会发生数据溢出,导致结果的不正确。

解析:

首先我们需要实现的是整数的反转。
比如说我们有一个数字123
首先我们取出最后一个数字(123%10=3),赋给res = 3 ;
然后让x/10,x就变成了12,然后再取出末尾的数字,加到res的后面,res就变成了32,进行同样的操作,最后res=321;

int res = 0;//初始化为0
int tmp = x % 10;//最后一位数字
res = res * 10 + tmp;//取出来的尾数,加到res上
x /= 10;//去掉最后一位数字

这样我们就实现了整数的反转。
怎么控制次数呢?
每次我们都对x进行除10操作,当只剩一位数时候,取余数就取的是他本身,当把它加到res上以后,对他进行除10操作以后就等于10le
所以控制条件就为x!=0;

x!=0

最需要注意的一点:
反转后整数的溢出。
int值的范围在-2147483648~2147483647之间
所以我们要对反转的结果就行判断。
题目中说假设只能存储32为的整数,所以我们不能借助long来判断。
那应该怎么判断呢?
我们可以在达到最大整数之前就开始判断,
如下图所示

为什么不用最终的结果判断是不是处于-2147483648~2147483647之间呢,
因为当结果不处于这个范围int会发生溢出,所以不论结果如何,都不可能发生溢出,所以在十位的位置我们就进行判断,

在这//判断是否 大于 最大32位整数
            if (res > 214748364 || (res == 214748364 && tmp > 7)) {
                return 0;
            }
            //判断是否 小于 最小32位整数
            if (res < -214748364 || (res == -214748364 && tmp < -8)) {
                return 0;
            }里插入代码片

最终代码:

public static int reverse4(int x) {
        int res = 0;
        while (x != 0) {
            //每次取末尾数字
            int tmp = x % 10;
            //判断是否 大于 最大32位整数
            if (res > 214748364 || (res == 214748364 && tmp > 7)) {
                return 0;
            }
            //判断是否 小于 最小32位整数
            if (res < -214748364 || (res == -214748364 && tmp < -8)) {
                return 0;
            }
            res = res * 10 + tmp;
            x /= 10;
        }
        return res;
    }
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Vivien_o.O

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值