前言
- 文章作为日记或心得,记录学习过程
- 本文记录本题(源自LeetCode)遇到的所有问题、疑惑
- 如对内容有任何建议或看法,欢迎评论区学习交流
正文
题目
根据示例,需要考虑不同情况的处理。
常用的一种方法是取余乘十后加起来。
需要考虑的问题为注意事项中的整数的溢出问题,像这样的要求我之前也没有接触过,所以刚开始的几次提交出现了很多问题。
错误的解答
class Solution {
public:
int reverse(int x) {
long ans=0;
if(x<0)
{
x=-x;
while(x!=0)
{
//上次结果*10后再取x%10放到后面
ans=ans*10+x%10;
//更新x的值
x=x/10;
}
return -ans>INT_MAX||-ans<INT_MIN?0:-ans;
}
else if (x>0)
{
while(x!=0)
{
ans=ans*10+x%10;
x=x/10;
}
return ans>INT_MAX||ans<INT_MIN?0:ans;
}
else
return 0;
}
};
之前是不清楚c++的负数取余规则,看了几篇答案之后大概清楚了,比如-5%3=-2,-12%10=-2,所以对于该题,不用像上面一样去分类了。
上面的错误还有第七行的x=-x
因为整型的取值范围在-231=-2147483648231-1=2147483647,所以这个语句在处理x=-231=-2147483648时,取负数之后就会越界。
当然,由于不用分正负讨论了,全部代码都要重做。
其他人的解答
官方给的判断是否溢出的方法我觉得有些不太能接受,每次循环判断ans=ans*10+x%10;
是否溢出,
if (rev > INT_MAX/10 || (rev == INT_MAX / 10 && pop > 7)) return 0;
if (rev < INT_MIN/10 || (rev == INT_MIN / 10 && pop < -8)) return 0;
这两句有种特殊值的感觉,对于不熟悉-231=-2147483648231-1=2147483647这两个数字的初学者可读性不是很好。
class Solution {
public:
int reverse(int x) {
int rev = 0;
while (x != 0) {
int pop = x % 10;
x /= 10;
if (rev > INT_MAX/10 || (rev == INT_MAX / 10 && pop > 7)) return 0;
if (rev < INT_MIN/10 || (rev == INT_MIN / 10 && pop < -8)) return 0;
rev = rev * 10 + pop;
}
return rev;
}
};
作者:LeetCode
链接:https://leetcode-cn.com/problems/reverse-integer/solution/zheng-shu-fan-zhuan-by-leetcode/
来源:力扣(LeetCode)
sms的解答很像官方的过程,但是却没有7和-8的内容,却仍可以通过测试
int reverse(int x)
{
int rev = 0;
while (x != 0)
{
if(rev > INT_MAX / 10 || rev < INT_MIN / 10)
return 0;
rev = rev * 10 + x % 10;
x /= 10;
}
return rev;
}
作者:sms
链接:https://leetcode-cn.com/problems/reverse-integer/solution/zheng-shu-fan-zhuan-by-sms-2/
来源:力扣(LeetCode)
int main()
{
if(typeid(INT_MAX)==typeid(int))
cout << 1 << endl;
}
vs运行后得知INT_MAX是整型,所以INT_MAX / 10
为214748364
rev>214748364的情况(*10肯定溢出,根据判断条件直接返回0)就不再考虑,下面考虑特殊情况
rev=214748364,使rev * 10 + x % 10
溢出,则需要x>7,然而实际上,若x的原来位数和231-1=2147483647相等为10位的话,x顶多只能取1和2,而由于rev=214748364,所以x只能是1463847412,x连2都取不到更不要说大于7了。
所以只需要判断rev > INT_MAX / 10 || rev < INT_MIN / 10
即可
由此看来,sms的代码虽然简单易懂,但其背后的含义需要深入理解,不然遇到类似问题的话,只是套用sms的模板很有可能会出错,这时候,官方答案的优势就体现出来了,其代码更加严谨、更具有适用性。