7. 整数反转

发布时间 2023-10-21 21:37:06作者: DawnTraveler

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 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());
        try {
            num = std::stoi(str);
            return (flag ? num: -num);
        } catch (const std::out_of_range& e) {
            // 处理溢出
            return 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. 数学方法(求余)

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

代码

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;
    }
};

作者:力扣官方题解
链接:https://leetcode.cn/problems/reverse-integer/solutions/755611/zheng-shu-fan-zhuan-by-leetcode-solution-bccn/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。