题目:
想了一下,感觉第一印象是用取余的方式先得到原来数字的最后一位,得到第一位反转数字,再将取余后的数字除以10排除最后一位,将得到的数字再取余数得到第二位反转数,将第一位反转数*10后与其相加,以此类推得到最后的反转数rev。(描述有点绕) 第一次写的代码如下:
class Solution { public int reverse(int x) { int rev = 0; while(x!=0){ int newRev; newRev=rev*10+x%10; rev=newRev; x=x/10; } return rev; } }由于没有考虑溢出的情况,导致题目判错,应该加入一条判断语句:如果新的反转数减去新得到的一位反转数的差不等于上一步的余数(计算后的结果减去求余得到的下一位的数字的差处以10是否等于当前反转数),将返回0. 即官方题解中的
if((newRev-x%10)/10!=rev){ return 0; }就可以解决溢出的问题。
另外题解评论区还出现了其他的优解 1.try catch 这种思路先通过字符串转换加try catch处理异常的方式解决,不过考虑到字符串转换的效率较低,而且使用了库函数,所以不建议考虑。 2.通过数学计算的方式解决
通过循环将数字x的每一位拆开,在计算新值时每一步都判断是否溢出。溢出条件有两个,一个是大于整数最大值MAX_VALUE,另一个是小于整数最小值MIN_VALUE,设当前计算结果为ans,下一位为pop。从ans * 10 + pop > MAX_VALUE这个溢出条件来看 (1) 当出现 ans > MAX_VALUE / 10 且 还有pop需要添加 时,则一定溢出 (2)当出现 ans == MAX_VALUE / 10 且 pop > 7 时,则一定溢出,7是2^31 - 1的个位数从ans * 10 + pop < MIN_VALUE这个溢出条件来看 (1)当出现 ans > MAX_VALUE / 10 且 还有pop需要添加 时,则一定溢出 (2)当出现 ans == MAX_VALUE / 10 且 pop > 7 时,则一定溢出,7是2^31 - 1的个位数代码
class Solution { public int reverse(int x) { int ans = 0; while (x != 0) { int pop = x % 10; if (ans > Integer.MAX_VALUE / 10 || (ans == Integer.MAX_VALUE / 10 && pop > 7)) return 0; if (ans < Integer.MIN_VALUE / 10 || (ans == Integer.MIN_VALUE / 10 && pop < -8)) return 0; ans = ans * 10 + pop; x /= 10; } return ans; } } 作者:guanpengchn 链接:https://leetcode-cn.com/problems/reverse-integer/solution/hua-jie-suan-fa-7-zheng-shu-fan-zhuan-by-guanpengc/ 来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。附上作者图解 总结 能想到的只有暴力求解的方式,而且不能完全考虑所有情况,经常不会处理溢出等情况,看了评论区各路神仙的题解和讨论也是一头雾水,哎,一边尽快过一遍数据结构一边再多刷自己稍微有头绪的题吧,任重而道远啊。。。