力扣--整数反转

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

以下是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

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;
}

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

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

这个是我的个人公众号,会把自己的学习心得,知识,笔记分享出去,也喜欢分享一些科技新鲜事
力扣--整数反转_第3张图片

你可能感兴趣的:(力扣刷题)