7. 整数反转

1.题目介绍

2.题解

2.1 转换为字符串反转问题

1.使用to_string()转化为字符串+reverse()反转+stoi()转化为整数+try catch处理溢出

//
// Created by trmbh on 2023-10-21.
//
#include <iostream>
#include <string>
#include <algorithm>
#include <sstream>
class Solution {
public:
    int reverse(int x) {
        // 判断是否为负数
        bool isNegative = (x < 0);
        // 将整数转换为字符串
        string str = to_string(x);
        // 反转字符串
        std::reverse(str.begin(), str.end());
        try {
            // 将反转后的字符串转换回整数
            /*如果反转后整数超过 32 位的有符号整数的范围 [−2^31,  2^31 − 1] ,就返回 0。这里INT_MIN反转后超出了INT_MAX,会发生溢出!!!*/
            int result = stoi(str);
            // 如果原整数是负数,则结果也是负数
            return isNegative? -result : result;
        } catch (const out_of_range& e) {
            return 0; // 转换失败或溢出时返回0
        }
    }
};

int main(){
    int num;
    Solution solution;
    std::cin >> num;
    std::cout << solution.reverse(num)<<std::endl;
}

2.使用istringstream流

关于istringstream流的基本用法,请参考 https://www.cnblogs.com/trmbh12/p/17779547.html
这里巧妙使用istringstream流的概念:

  • 如果提取成功,该表达式的值将是 iss 对象(即 iss 对象本身被视为 true)。
  • 如果提取失败,例如因为输入不是有效的整数,那么 iss 对象将进入错误状态,并且该表达式的值将是 false,而不是0。这意味着 if (iss >> num) 将为 false,表示提取失败,而不会将0赋给 num。

class Solution {
public:
    int reverse(int num) {
        bool flag = true;
        std::string str = std::to_string(num);
        if (num < 0) {
            flag = false;
            str.substr(1);
        }
        std::reverse(str.begin(), str.end());
        std::istringstream iss(str);
        if(iss >> num) return (flag ? num : -num);
        else return 0;
    }
};

2.2 数学方法(求余)

思路很简单,就是不断求余相加

代码

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

posted @ 2023-10-21 21:33  DawnTraveler  阅读(7)  评论(0编辑  收藏  举报