[LeetCode] Reverse Integer

Given a 32-bit signed integer, reverse digits of an integer.

Example 1:

Input: 123
Output: 321

Example 2:

Input: -123
Output: -321

Example 3:

Input: 120
Output: 21

Assume we are dealing with an environment which could only store integers within the 32-bit signed integer range: [−2^{31}2^{31} − 1]. For the purpose of this problem, assume that your function returns 0 when the reversed integer overflows.

 

Solution

Pop and Push Digits & Check before Overflow

Intuition

We can build up the reverse integer one digit at a time. While doing so, we can check beforehand whether or not appending another digit would cause overflow.

Algorithm

Reversing an integer can be done similarly to reversing a string.

We want to repeatedly "pop" the last digit off of xx and "push" it to the back of the \text{rev}rev. In the end, \text{rev}rev will be the reverse of the xx.

To "pop" and "push" digits without the help of some auxiliary stack/array, we can use math.

//pop operation:
pop = x % 10;
x /= 10;

//push operation:
temp = rev * 10 + pop;
rev = temp;

However, this approach is dangerous, because the statement temp=rev⋅10+pop can cause overflow.

Luckily, it is easy to check beforehand whether or this statement would cause an overflow.

To explain, lets assume that rev is positive.

Similar logic can be applied when rev is negative.

class Solution {
public:
	int reverse(int x) {
		int rev = 0;
		while (x != 0) {
			int pop = x % 10;
			x /= 10;
			if (rev > INT_MAX/10 || (rev == INT_MAX/10 && pop > 7)) return 0;
			if (rev < INT_MIN/10 || (rev == INT_MIN/10 && pop < -8)) return 0;
			rev = rev * 10 + pop;
		}
		return rev;
	}
};

在这里需要注意的是题目中说假设环境只能够存储32位有符号的整数,所以有一些解法利用c++ 的long或者long long来解决问题是不合理的,还有就是c++和python的负数取余的结果是不一样的,比如说对于-9%10在c++的结果为-9,在python的结果为1。四个字节的有符号整数的取值范围为-2,147,483,648~2,147,483,647,检查溢出的时候要注意这一点。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值