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