1 题目
Given a 32-bit signed integer, reverse digits of an integer.
给定一个32bit的有符号数,翻转这个数字
Example 1:
Input: 123 Output: 321
Example 2:
Input: -123 Output: -321
Example 3:
Input: 120 Output: 21
Note:
Assume we are dealing with an environment which could only hold integers
within the 32-bit signed integer range. For the purpose of this
problem, assume that your function returns 0 when the reversed integer
overflows.
假设你解决问题的环境只能保存32位的有符号数。当溢出的时候返回0.
2 分析
那这个问题就在于判断溢出了。
假设ret 是本次循环之前的数字,y为要添加的数字,那么
ret*10+y就是下次要添加的数字。
那么如果ret*10+y>INT_MAX了,那么就会溢出。
如果溢出了,那么ret%10 就不等于 y了
嗯,思路就是这样,如果溢出,那么取余以后就回不去了
class Solution { public: int reverse(int x) { int result = 0; while (x) { int digit = x % 10; int temp = result; result = result * 10 + digit; // 如果取余以后还能回去,就表明没有溢出 if ((result - digit) / 10 != temp) { return 0; } x = x / 10; } return result; } };
3 总结
思路千千万啊。
直接保存为long long可以,但是貌似要求是只能存储32位的。
然后就是上面的思路。
其实我自己想的是:
ret*10+y>INT_MAX表示溢出
那么 (INT_MAX-y)/10 <ret也表示溢出。但是会出错。