整数翻转解法一:
- class Solution {
- public:
- int reverse(int x) {
- int res = 0;
- while (x != 0) {
- if (abs(res)> INT_MAX / 10) return 0;
- res = res * 10 + x % 10;
- x /= 10;
- }
- return res;
- }
- };
在贴出答案的同时, OJ 还提了一个问题 To check for overflow/underflow, we could check if ret> 214748364 or ret <-214748364 before multiplying by 10. On the other hand, we do not need to check if ret == 214748364, why? (214748364 即为 INT_MAX / 10)
为什么不用 check 是否等于 214748364 呢, 因为输入的 x 也是一个整型数, 所以 x 的范围也应该在 -2147483648~2147483647 之间, 那么 x 的第一位只能是 1 或者 2, 翻转之后 res 的最后一位只能是 1 或 2, 所以 res 只能是 2147483641 或 2147483642 都在 int 的范围内. 但是它们对应的 x 为 1463847412 和 2463847412, 后者超出了数值范围. 所以当过程中 res 等于 214748364 时, 输入的 x 只能为 1463847412, 翻转后的结果为 2147483641, 都在正确的范围内, 所以不用 check.
我们也可以用 long 型变量保存计算结果, 最后返回的时候判断是否在 int 返回内, 但其实题目中说了只能存整型的变量, 所以这种方法就只能当个思路扩展了, 参见代码如下:
整数翻转解法二:
- class Solution {
- public:
- int reverse(int x) {
- long res = 0;
- while (x != 0) {
- res = 10 * res + x % 10;
- x /= 10;
- }
- return (res> INT_MAX || res < INT_MIN) ? 0 : res;
- }
- };
来源: http://www.bubuko.com/infodetail-3077405.html