每日算法题--整数反转(简单)

题目描述:

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

示例 1:

输入: 123
输出: 321

示例 2:

输入: -123
输出: -321

示例 3:

输入: 120
输出: 21

注意:

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

题解:

首先进行数字反转,我们第一时间想的肯定是,怎么把数字拆分啊?回想一下所学的知识,用取余就能取到数字 了呗。

取余的过程:

123%10=3 、123/10=12

12%10=2 、12/10=1

1%10=1,

然后再拼接一下

3* 10 *10 =300

2 * 10 =20

1

相加不就等于321了吗?

那么如果数字长度再大一点呢?如果数字为负数呢?

那么我们设一下传过来的值为X

则取余x%10,得来个参数接收一下吧设个res 吧。

那么res =x%10

余数知道了,是否就得将 余数 * 10 * 你取余几次吧

那就得到res * 10 * 取余次数

再者我们既然是取余到0为止,那么为啥不设置一个判断条件呢?

就比如说while(x!=0)?

那么根据这个判断条件就可以知道取余多少次了呗!!

那么开始的肯定是:res=0, temp接收也为0;

temp = x%10 + res * 10 既 res =x%10 + res * 10

这里的+号,代表拼接的意思啊。就比如上面的3*10+2 再循环一次就是3 * 10 *10 + 2 * 10 +1

那么根据上面的分析还得在循环中加上 x/10

我们再看看题目:

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

什么意思啊?

举个简单例子:

假设125处于int型的最大值,那么反转一下这521就出long型了,超出了范围,就为整数溢出。

那么根据这个例子是否可以知道最后返回的res可以根据这个整型和长整型判断

由此可得

(int) res == res ? (int) res : 0;

最后看一下总体代码

总体代码
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while(sc.hasNext()){
            int a = sc.nextInt();
            System.out.println(reverse(a));
        }
    }
    public static int reverse(int x) {
        long res = 0;
        while (x != 0) {
            res = res * 10 + x % 10;
            x /= 10;
        }
        //判断是否溢出
        //如果res溢出了,则为long型(这个是毋庸置疑的)
        //按照下面的等式可知:
        // 则你拿一个(int)res这个强转为int型的res  跟  res可能为long型,可能为int型的进行比较,
        // 如果res为int型,那么相等,则没有溢出。如果res为long型,那么则不相等,就溢出呗。
        return (int) res == res ? (int) res : 0;
    }
}

算法题来源:力扣
欢迎朋友们一起进步!!!
2020-12-10

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值