• 整数反转


    题目来源力扣第七题,链接: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


  • 相关阅读:
    oracle_case when
    sql记录
    修改tomcat默认编码
    sql server_TED(透明数据加密)
    web请求过程
    freemarker 标签循环list 以及获取下标值
    鼠标操作
    窗口切换
    日历控件
    xpath定位
  • 原文地址:https://www.cnblogs.com/yulongzhou/p/12385877.html
Copyright © 2020-2023  润新知