原题链接:7. 整数反转 - 力扣(LeetCode) (leetcode-cn.com)
一、思路
两种思路,一是用to_string转换成字符串进行处理,反转再转回。这种方法略有取巧意味,这里不用。
另外有一种思路是逐个取出每位数字(利用取模与除法),再进行反转(秦九韶)。需要另外注意的一点是,c++对负数取模运算,得到的结果为负。可以验证,这里对正负采用相同的式子结果同样正确。
注意这里有个问题,感觉原题目稍有歧义。
不是很理解这个不允许存储64位数字是限制,还是答案的背景(因为在解题时发现long long竟然也能用。
这里把两种方法都写出来,一种用longlong, 一种不用。
二、代码
class Solution {
public:
int reverse(int x) {
long long res = 0;
while(x != 0){
res = res * 10 + x%10;
x /= 10;
}
if(res > INT_MAX) return 0;
if(res < INT_MIN) return 0;
return res;
}
};
这是使用longlong的方法,能够避免很多在计算中因为溢出导致的错误,最后转回int,很方便。
然后是使用int的做法,这个时候就要注意了,要避免溢出(思路:转换表达式)
代码:
class Solution {
public:
int reverse(int x) {
int res = 0;
while(x != 0){
if(x > 0 && res > (INT_MAX - x % 10)/10) return 0;
if(x < 0 && res < (INT_MIN - x % 10)/10) return 0;
res = res * 10 + x%10;
x /= 10;
}
return res;
}
};