第一天刷的题是leetcode上的#142 reverse-integer,主要是给定一个整型数,求它的相反数,例如给定123,输出321。而难点在于如何判断溢出,因为int最大为32bit,翻转后可能会溢出,具体详情如下: 看到题目后,初步想法是通过一步一步取余数获取最后一位再反推回去,但在防止溢出这一步想了很久没有思路,最终查看了别人大佬的答案,发现一种不错的解法。
具体思路是:
public int reverse (int x) { Scanner sc = new Scanner(System.in); System.out.println(" 请输入你的数字"); x=sc.nextInt(); int y =0; while(x!=0) { int tial = 0; tial = x%10;//得到x的最后一位数 y=y*10+tial;//更新y的值,将x的最后一位数放在y的第一位 x=x/10;//更新x,去除最后一位,进入下一轮循环 } return y; }当然这样做虽然可以实现取得相反数的功能,但是却不能判断是否溢出,所以可以在其中增加一个参数new_y,在更新y之前先反推回去与原来的y比较,如果两者不相同,则说明溢出了。
更改后代码如下:
public int reverse (int x) { Scanner sc = new Scanner(System.in); System.out.println(" 请输入你的数字"); x=sc.nextInt(); int y =0; while(x!=0) { int tial = 0; int new_y = 0; tial = x%10;//得到x的最后一位数 new_y=y*10+tial;// 中间设置一个参数判断是否溢出用 if((new_y-tial)/10!=y) { return 0; } x=x%10;//更新x,去除最后一位 y=new_y;//更新y } return y; }这样就可以达到检测是否溢出的效果了,能实现是因为反推回去时如果超过了int的最大值,二进制会抛弃高位的码,于是就跟原来的不一样了。
其实最简单的方法是设置中间值为long型,每次检测大于0x7fffffff或者小于0x80000000就溢出。
记录一下,希望能每天坚持下去。