【LeetCode】第7题:整数反转

 

题目:给你一个 32 位的有符号整数 x ,返回 x 中每位上的数字反转后的结果。如果反转后整数超过 32 位的有符号整数的范围 [−231,  231 − 1] ,就返回 0。假设环境不允许存储 64 位整数(有符号或无符号)。

示例 1:
输入:x = 123
输出:321

示例 2:
输入:x = -123
输出:-321

示例 3:
输入:x = 120
输出:21

示例 4:
输入:x = 0
输出:0

提示:
-231 <= x <= 231 - 1
 

思路:

  1. 通过对x进行%10可以得到末位数字,将其得到的末位数字放入result首位。完成一次操作后result*=10; x/=10;不断循环,循环条件是x>0。
  2. 此时发现x经过反转后可能会溢出,因此需要对其进行溢出判断。常规的做法是为了防止溢出使用long存储,若大于INT_MAX则输出0。但这道题中因为不能使用long所以得使用别的方法。因为在每次while循环中增加一个溢出的判断条件语句,溢出可能有两种情况:result>INT_MAX或者result>214748364&&x>7;若出现则其结果返回0.
  3. 因为以上分析都是基于正数,关于负数的处理:若小于0则返回-reverse(-x),这样所有满足条件的x应该都在考虑范围之中了。
  4. 通过此思想编写程序之后发现当x取INT_MIN无法通过测试。原因在于signed int型负数可以比正数多表示一位,因此完善代码增加 
if (x == INT_MIN)
            return 0;

 


最终代码:


class Solution 
{
public:
	int reverse(int x) 
	{
		int result = 0;
		if (x == INT_MIN)
			return 0;
		if (x < 0)
			return -reverse(-x);
		while (x > 0)
		{
			result = result * 10 + x % 10;
			if (result > INT_MAX || (result > 214748364 && x > 7))
				return 0;

			x = x / 10;
		}
		return result;
	}
};

 

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值