打卡力扣第一天:
题目:
原思路: 刚看到这道题,起初认为先将整数转为字符串,再将这个字符串翻转
优秀的思路:仔细想想其实只用取整数的最后一位,(如何取最后一位? 取余的办法就好咯 !)然后再将这个数字/10,在取余,如此往复,直到这个整数/10 == 0 结束 ,所以要用循环。
举个栗子:
如果输入的数字为12345;
第一次:12345%10 得5 再将12345/10
第二次:1234%10 得4 再将1234/10
第三次: 123%10 得3 再将123/10
第四次: 12%10 得2 再将12/10
第五次: 1%10 得1 再将1/10
第六次:1/10 == 0 (结束循环)
其次,题目中还有个判断条件,若没有这个判断条件,这个题就上面的循环就搞定了
范围值:
2^31 = 2147483647
-2^31-1 = -2147483648
有些数字像1112223339,原数值是在范围值之内的,但是翻转后则将超出范围值,所以我们要判断 ,如何判断呢?
在反转后的值中,我们发现只要数字到了214748365这个时候,就不用继续下去了,直接返回0,因为即便最后一位是个最小的数字0,但他的十位已经大于4了。
接着,如果数字等于214748364这个时候,要判断接下来这个个位是否大于7,若大于7,也将溢出,直接返回0即可。
对于负数呢,其实也是一样的,如果数字小于-214748364,溢出
如果等于-214748364,则比较最后一位,若大于8,溢出
代码:
class Solution { public int reverse(int x) { int res = 0; while(x!=0) { //每次取末尾数字 int tmp = x%10; //判断是否 大于 最大32位整数 if (res>214748364 || (res==214748364 && tmp>7)) { return 0; } //判断是否 小于 最小32位整数 if (res<-214748364 || (res==-214748364 && tmp<-8)) { return 0; } res = res*10 + tmp; x /= 10; } return res; } }