标签:10 return INT 反转 ret 力扣 ------ 解法
目录
题目
7.整数反转
给你一个 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
https://leetcode-cn.com/problems/reverse-integer/
源代码及漏洞
即使通过了全部测试用例,但是用其他的测试用例跑却解不出正确答案。
漏洞分析
因为本人是个菜鸟,在第一次提交的时候看到只剩下这一个测试用例没有跑过,以为是某种特殊情况,直接添加if判断提交了。
然后就出现了投机取巧的代码,虽然通过了这道题,但是依旧是有bug的。
这道题的测试用例我觉得应该再多一些。所以总的来说,就是这道题测试用例不够多。可能是我太菜了。。。。。。。
再来说说正确解法吧。
正确的三种解法
思路
反转并不难,主要是溢出检测。
解法一:用long类型
不做多余解释
long ret =0;
while(x!=0)
{
ret=ret*10+x%10;
x/=10;
}
if(ret>INT_MAX || ret<INT_MIN) //溢出
{
return 0;
}
return ret;
解法二:用unsign int 类型
我们知道无符号数超过对应比特位的最大值后,会产生进位。进位后再截断,我们只要判断有没有发生截断==有没有溢出。
用temp保存未反转之前的结果,和反转后/10比较,如果没有溢出,则是相等的,如果溢出了,截断后的结果/10 一定不等于temp。
if(x== INT_MIN)
{
return 0;
}
unsigned int ret=0;
int IsNegative=0; //负数的标志
if(x<0)
{
x=abs(x);
IsNegative=1;
}
while(x>0)
{
int temp=ret;
ret=ret*10+x%10;
x/=10;
if(temp != ret/10) //
{
return 0;
}
}
if(ret>2147483648 || (ret==2147483648 && !IsNegative))
{
return 0;
}
if(IsNegative)
{
ret=0-ret;
}
return ret;
解放三:末尾检测(官方题解)
其实在反转的时候,小于INT_MAX/10和 大于INT_MIN/10的数字反转是没有溢出的可能性的,所以不做检测。
只有最后一个数字,在反转的时候,如果前面的数字已经大于INT_MAX/10 或者 小于INT_MIN/10,一定在最后一位的反转下(*10)溢出。
再来说等于的临界情况,如果等于,则判断剩下的最高位,如果不符合 INT_MAX或者 INT_MIN的最后一位的要求,则溢出。
int ret=0;
while(x/10)
{
ret=ret*10+x%10;
x/=10;
}
if(ret>INT_MAX/10 || (ret==INT_MAX/10 && x>7))
{
return 0;
}
if(ret<INT_MIN/10 || (ret==INT_MIN/10 && x<-8))
{
return 0;
}
return ret*10+x;
标签:10,return,INT,反转,ret,力扣,------,解法 来源: https://blog.csdn.net/Zhou000815/article/details/114331223
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。