7. Reverse Integer

题目描述(简单难度)

在这里插入图片描述
很简单,就是输入整数,输出它的倒置。

第一反应就是, 取余得到个位数,然后除以 10 去掉个位数,然后用一个变量保存倒置的数

public class Reverse_Integer {
	public static int reverse(int x) {
		int rev=0;
		while(x!=0) {
			int pop = x % 10;
			x/=10;
			rev=rev*10+pop;
		}
		return rev;
	}
	public static void main(String args[]) {
		int x=123;
		int ans=reverse(x);
		System.out.println("倒叙之后的结果是:"+ans);
	}
}

然后似乎我们忘记考虑了什么。
在这里插入图片描述
为什么呢?倒置过来不应该是 9646324351 吗。其实题目里讲了,int 的范围是 [ − 2 31 , 2 31 − 1 ] \left[-2^{31}, 2^{31}-1\right] [231,2311],也就是[-2147483648,2147483647]。明显 9646324351 超出了范围,造成了溢出。所以我们需要在输出前,判断是否溢出。

问题的关键就是下边的一句了。

rev = rev * 10 + pop;

为了区分两个 rev ,更好的说明,我们引入 temp 。

temp = rev * 10 + pop;
rev = temp

我们对 temp = rev * 10 + pop; 进行讨论。intMAX = 2147483647 , intMin = - 2147483648

对于大于 intMax 的讨论,此时 x 一定是正数,pop 也是正数。

  • 如果 rev > intMax / 10 ,那么没的说,此时肯定溢出了。
  • 如果 rev == intMax / 10 = 2147483647 / 10 = 214748364 ,此时 rev * 10 就是 2147483640 如果 pop 大于 7 ,那么就一定溢出了。但是!如果假设 pop 等于 8,那么意味着原数 x 是 8463847412 了,输入的是 int ,而此时是溢出的状态,所以不可能输入,所以意味着 pop 不可能大于 7 ,也就意味着 rev == intMax / 10 时不会造成溢出。
  • 如果 rev < intMax / 10 ,意味着 rev 最大是 214748363 , rev * 10 就是 2147483630 , 此时再加上 pop ,一定不会溢出。

对于小于 intMin 的讨论同理。

public class improve_Reverse_Integer {
	public static int reverse(int x) {
	    int rev = 0;
	    while (x != 0) {
	        int pop = x % 10;
	        x /= 10;
	        if (rev > Integer.MAX_VALUE/10 ) return 0;
	        if (rev < Integer.MIN_VALUE/10 ) return 0;
	        rev = rev * 10 + pop;
	    }
	    return rev;
	}
	public static void main(String args[]) {
		int x=1534236469;
		int ans=reverse(x);
		System.out.println("输入之前的数字是:"+x);
		System.out.println("倒叙之后的结果是:"+ans);
	}
}

在这里插入图片描述

时间复杂度:循环多少次呢?数字有多少位,就循环多少次,也就是 log ⁡ 10 ( x ) + 1 \log _{10}(x)+1 log10(x)+1次,所以时间复杂度是 O(log(x))。

空间复杂度:O(1)。

当然我们可以不用思考那么多,用一种偷懒的方式 AC ,我们直接把 rev 定义成 long ,然后输出前判断 rev 是不是在范围内,不在的话直接输出 0 。

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

参考文献

  • https://zhuanlan.zhihu.com/p/55746844
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

安替-AnTi

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

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

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

打赏作者

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

抵扣说明:

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

余额充值