100 Days of Code-day2

LeetCode题目(整数反转):
给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。
如果反转后整数超过 32 位的有符号整数的范围 [−231, 231− 1] ,就返回 0。假设环境不允许存储 64 位整数(有符号或无符号)。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/reverse-integer
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
在这里插入图片描述图片来源:https://leetcode-cn.com/problems/reverse-integer/solution/tu-jie-7-zheng-shu-fan-zhuan-by-wang_ni_ma/
如上图所示,令x=12345,通过x%10的取余运算“弹出”x的末尾数字并用digit变量记录下来,当然这还需要通过x/10这个取整运算来“移动”剩下的数字。比如12345%10=5,弹出末尾数字5后,12345/10=1234。然后就是通过不断“推入”得到翻转的数字rev,通过rev=rev*10+digit这个语句不断将x的末尾数字推入到rev数字末尾处。后面的以此类推。直到x中的所有数字均被弹出,即x=0时循环停止。
在这里插入图片描述
表 1
题中要求翻转后的整数不能超出32位有符号整数的范围,所以说程序中就要注意如何防止溢出现象的发生。比如有些数字输入时是符合要求的,但在翻转之后超出了规定范围。如上表所示,第二行中翻转后的为2147483651,它在没翻转前的数字(1563847412)是小于最大的32位整数2147483647。这样翻转后就会发生数据溢出。因此需要对出现溢出的情况进行分析。
首先,什么情况下绝对不会有溢出的情况发生。答案是输入x的位数小于10的时候。这个时候无论值有多大,都不可能大于最大的32位整数。如上表的最后一行所示。
而当位数等于10时,就需要注意是否有溢出了。上表第一行是最大的32位有符号整数。橘色的数字5大于同位置的4,而且不论个位数是多少都会出现溢出。所以,就会想到rev与最大32位整数的前9位进行比较。这里有人不免回想为什么将rev同最大32位整数的前8位,甚至是前7位比较?如果那样比较的话,原本绝不可能溢出的数,但电脑执行程序时就会判断出现了溢出。例如表1最后一行,这个9位数的前8位是21474838,而最大的32位有符号整数的前8位是21474836,最后的出的结果是溢出。打个不恰当的比方,这就好比处对象,不能因为这个人脸好看比另一人好看就选他,应该看这个人的整体好不好。如表1第1,5行所示,两者的前9位的比较比只比较前7位效率更高,更全面。
言归正传,将rev与最大32位整数的前9位进行比较,也就是rev与[INT_MAX/10]进行比较。(这里也不能将rev与INT_MAX直接进行比较,因为INT_MAX就是最大的int值,所以不可能有int值比它还大,所以说电脑永远不会识别出数据溢出,简单说就是不可能返回0)
1.rev>[INT_MAX/10],如表1的第1,2行所示,发生溢出。
2.rev=[INT_MAX/10],如表1的第1,3,4行所示,首先意识到第4行为非法输入,所以说digit≤2。但当digit=2时也是非法输入。所以这种情况不可能出现溢出。
3.rev<[INT_MAX/10],如表1的第1,6行所示,同样不可能出现溢出。
所以最终判定在(rev<(INT_MIN/10)||rev>(INT_MAX/10)时,返回0,表明溢出。
相应的程序:

int main()
{
	int x;
	scanf("%d",&x);
	printf("%d", reverse(x));
	return 0;
}
int reverse(int x) {
	int digit;
	int rev = 0;
	while (x != 0)
	{
		if (rev<(INT_MIN / 10) || rev>(INT_MAX / 10))
		{
			return 0;
		}
		digit = x % 10;
		x = x / 10;
		rev = rev * 10 + digit;
	}
	return rev;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值