整数反转

题目来源力扣第七题,链接:https://leetcode-cn.com/problems/reverse-integer

给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。

示例 1:

输入: 123
输出: 321
 示例 2:

输入: -123
输出: -321
示例 3:

输入: 120
输出: 21
注意:

假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−2^31,  2^31 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。


解题思路:

1. 设输入为 “123

2. 每次取最后一位数据进行计算(结果加上其数值与权值相乘)然后加上其结果,如上例中,

   2.1 取 ”123“中的”3“,3 * 100 = 300

   2.2 取”123“中的”2“, 2 * 10 =20

 2.3 取”123“中的”1“, 1 * 1 = 1

故结果为:300 + 20 + 1 = 321

3. 实时判断数据是否溢出,若溢出返回0

  3.1 实时判断结果值是否大于INI_MAX/10 或小于 INI_MIN/10,如达到此条件则需要留意数据是否还有下一位,如有则可判断为溢出。

       3.2 实时判断结果值是否等于INI_MAX/10或INI_MIN/10, 如达到此条件则需要考虑数据下一位是否有,若有,是否大于7或者小于-8,若是,则溢出返回0。


代码:

#include <iostream>
#include <climits>
using  namespace std;

class Solution {
public:
    int reverse(int x) {
        int result(0);
        while (x!=0) {
            if (result > INT_MAX / 10 || (result == INT_MAX && x > 7)) {
                return 0;
            }
            if (result < INT_MIN / 10 || (result == INT_MIN && x < -8)) {
                return 0;
            }
            result *=10; // 每取出一位数,则提升之前所有已取出位数的权值
            result += x % 10; // 取出最后一位数,并加到结果中
            x /= 10; // 舍去已添加位数
        }
        return result;
    }
};
int main() {
    Solution solution;
    int eg0(2147483647), eg1(1463847412), eg2(-123456);
    cout << "eg0: " << solution.reverse(eg0) << endl;
    cout << "eg1: " << solution.reverse(eg1) << endl;
    cout << "eg2: " << solution.reverse(eg2) << endl;
    return 0;
}

输出:

eg0: 0
eg1: 2147483641
eg2: -654321

学习了一下他人的代码发现,自己身体不清,考虑不周。由于题目中假设环境中只能存储32位数据,故无论输入数据还是输出数据均只能为32位数据,故无需做 上述中3.2的判断。若结果前九位的值未超过INI_MAX以及未小于INI_MIN的值,则无需判断第十位是否溢出,因为,其值只能在 -2 ~

 2 之间


代码修改:

#include <iostream>
#include <climits>
using  namespace std;

class Solution {
public:
    int reverse(int x) {
        int result(0);
        while (x!=0) {
            if (result > INT_MAX / 10) {
                return 0;
            }
            if (result < INT_MIN / 10) {
                return 0;
            }
            result *=10;
            result += x % 10;
            x /= 10;
        }
        return result;
    }
};
int main() {
    Solution solution;
    int eg0(2147483647), eg1(1463847412), eg2(-123456);
    cout << "eg0: " << solution.reverse(eg0) << endl;
    cout << "eg1: " << solution.reverse(eg1) << endl;
    cout << "eg2: " << solution.reverse(eg2) << endl;
    return 0;
}

输出:

eg0: 0
eg1: 2147483641
eg2: -654321


原文地址:https://www.cnblogs.com/yulongzhou/p/12385877.html