力扣--整数反转

题目https://leetcode-cn.com/problems/reverse-integer/题目
这个问题的思路比较简单,但是我在做题的时候问题就出现在范围上面,有可能反转后会超出整型的范围。

以下是C++代码,不影响阅读

程序中比较核心的代码

int pop, rev;
while (x)
{
	pop = x % 10;
	x /= 10;
	rev = rev * 10 + pop;
}

这个过程中,很可能rev超出了整型范围。所以我们可以推导出rev最大值
r e v = I N T M A X / 10 rev = INTMAX/10 rev=INTMAX/10
根据题意可以看到如果超出范围,则有rev>INTMAX/10,或者当rev = INTMAX/10,pop>7。
以上只是考虑了x大于0的情况,小于0也是同理。rev<INTMIN/10,或者rev = INTMIN/10,pop<-8。

int reverse(int x) 
{
	if (x == 0)
		return 0;
	int sum = 0, pop;
	while (x)
	{
		pop = x % 10;
		if (sum  > INT_MAX/10 || (sum == INT_MAX/10)&& pop > 7)
			return 0;
		if (sum <INT_MIN / 10 || (sum == INT_MAX / 10) && pop < -8)
			return 0;
		sum =sum*10+ pop;
		x /= 10;
	}
	return sum;
}

result
有些小伙伴可能会问为什么当sum = INTMAX 时候,pop>7.
我们根据题意可以知道x的范围是[-231,231-1]
-231 = -2 147 483 648;
231-1 =2 147 483 647;
pop加上sum是加到个位上,所以个位数最大的是7
pop<-8同理

本人只是一个初学算法的小白,所以开始慢慢的刷题来提升自己,如果文章有什么不对的地方希望各位大佬指出来,有什么不懂的也可以留言

这个是我的个人公众号,会把自己的学习心得,知识,笔记分享出去,也喜欢分享一些科技新鲜事
公众号

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值