Reverse digits of an integer.
Example1: x = 123, return 321
Example2: x = -123, return -321
总结:处理整数溢出的方法
①用数据类型转换long 或 long long
②在每次循环时先保存下数字变化之前的值,处理后单步恢复看是否相等 (比③好)
③整体恢复,看数字是否相等。
思路:注意30000这样以0结尾的数字,注意越界时返回0.
我检查越界是通过把翻转的数字再翻转回去,看是否相等。
int reverse(int x) { int xx = abs(x); int ans = 0; int zeros = 1; //如果x = 2000 这种后面有很多0 那翻转后是2 再翻转还是2 需要乘以1000才能恢复成2000 while(xx != 0) { int r = xx % 10; xx /= 10; ans = ans * 10 + r; if(ans == 0) zeros *= 10; } ans = (x < 0) ? -ans : ans; //检测是否溢出 思路把数字重新翻转回去,看结果是否相同 int anss = abs(ans), check = 0; while(anss != 0) { int r = anss % 10; anss /= 10; check = check * 10 + r; } check = (x < 0) ? -check : check; check *= zeros; if(check != x) //溢出了 return 0; else return ans; }
基于②的判断:
public int reverse(int x) { int result = 0; while (x != 0) { int tail = x % 10; int newResult = result * 10 + tail; if ((newResult - tail) / 10 != result) { return 0; } result = newResult; x = x / 10; } return result; }
基于①的判断:
int reverse(int x) { long num = abs((long)x); long new_num = 0; while(num) { new_num = new_num*10 + num%10; num /= 10; } if (new_num > INT_MAX) { return 0; } return (x<0 ? -1*new_num : new_num); }