题目
给你一个 32 位的有符号整数 x
,返回将 x
中的数字部分反转后的结果。
如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1]
,就返回 0。
假设环境不允许存储 64 位整数(有符号或无符号)。
示例 1:
输入:x = 123 输出:321
示例 2:
输入:x = -123 输出:-321
示例 3:
输入:x = 120 输出:21
示例 4:
输入:x = 0 输出:0
提示:
-231 <= x <= 231 - 1
代码展示
class Solution {
public:int reverse(int x) {string ret=to_string(x);int length=ret.size();string str="";if(ret[0]=='-'){str+="-";}for(int i=length-1;i>=0;i--){if (ret[i] != '-') {str += ret[i];}}try {int num = std::stoi(str);return num;} catch (const std::out_of_range& e) {// 如果转换失败(溢出),返回0return 0;}}
};
逐行解析
-
类定义:
class Solution { public:
定义一个名为
Solution
的类,并声明一个公共成员函数reverse
。 -
函数定义:
int reverse(int x) {
定义一个公共成员函数
reverse
,接受一个整数参数x
并返回一个整数。 -
将整数转换为字符串:
string ret = to_string(x);
使用
to_string
函数将整数x
转换为字符串ret
。 -
获取字符串的长度:
int length = ret.size();
获取字符串
ret
的长度,并将其存储在length
变量中。 -
创建一个空字符串来存储反转后的结果:
string str = "";
初始化一个空字符串
str
,用于存储反转后的结果。 -
处理负号:
if (ret[0] == '-') {str += "-"; }
检查字符串
ret
的第一个字符是否为负号。如果是,将负号添加到结果字符串str
中。 -
从后向前遍历字符串,将字符添加到结果字符串中
for (int i = length - 1; i >= 0; i--) {if (ret[i] != '-') {str += ret[i];} }
- 使用一个
for
循环从字符串ret
的最后一个字符开始,向前遍历。 - 在每次迭代中,检查当前字符是否为负号。如果不是,将其添加到结果字符串
str
中。
- 使用一个
-
尝试将字符串转换为整数:
try {int num = std::stoi(str);return num; } catch (const std::out_of_range& e) {// 如果转换失败(溢出),返回 0return 0; }
- 使用
try
块尝试将结果字符串str
转换为整数num
。 - 如果转换成功,返回
num
。 - 如果转换失败(例如,溢出),捕获
std::out_of_range
异常并返回0
。
- 使用
总结
- 字符串转换:使用
to_string
将整数转换为字符串。 - 处理负号:在遍历字符串时,先处理负号,确保负号被正确添加到结果字符串中。
- 字符串反转:从后向前遍历字符串,将字符添加到结果字符串中。
- 整数转换:使用
std::stoi
将结果字符串转换为整数,并捕获可能的异常。
这个题相比于回文数。最困难的一点其实在于溢出这个异常处理