平凉有做企业网站的吗,杭州网站排名优化公司,logo商标设计网站,响应式网站建设公司'题目描述 整数反转
给你一个 32 位的有符号整数 x #xff0c;返回将 x 中的数字部分反转后的结果。
如果反转后整数超过 32 位的有符号整数的范围 [−2^31, 2^31 − 1] #xff0c;就返回 0。
假设环境不允许存储 64 位整数#xff08;有符号或无符号#xff09;。
示…题目描述 整数反转
给你一个 32 位的有符号整数 x 返回将 x 中的数字部分反转后的结果。
如果反转后整数超过 32 位的有符号整数的范围 [−2^31, 2^31 − 1] 就返回 0。
假设环境不允许存储 64 位整数有符号或无符号。
示例 1
输入x 123
输出321示例 2
输入x -123
输出-321示例 3
输入x 120
输出21示例 4
输入x 0
输出0提示
-2^31 x 2^31 - 1
解法
转字符串反转
转为字符串后从后往前遍历反转
java代码
public int revers(int x) {String s String.valueOf(x);// 如果第一个是-则删除标记有横杠boolean hasHyphen false;if (s.charAt(0) 45) {s s.substring(1);hasHyphen true;}StringBuilder resBuilder new StringBuilder();// 注意点1.末尾的0去掉中间的0保留2.如果会死负数把-去掉2.-2147483648超过了范围返回0// 最后一位是否是0如果是0把末尾的0都去掉遇到第一个非0后不再去掉0不是0则不需要去0boolean deleteZero s.charAt(s.length() - 1) 48;for (int i s.length() - 1; i -1; i--) {// 如果需要删除0并且遇到了非0则后面就不再去掉0if (deleteZero s.charAt(i) ! 48) {deleteZero false;}// 如果是0并且需要删除0则略过if (s.charAt(i) 48 deleteZero) {continue;}resBuilder.append(s.charAt(i));}String resString resBuilder.toString();// 判断是否超过范围负数的话不超过2147483648整数的话不超过2147483647if ((hasHyphen (resString.length() 10 || (resString.length() 10 resString.compareTo(2147483648) 0)))|| (!hasHyphen (resString.length() 10 || (resString.length() 10 resString.compareTo(2147483647) 0)))) {return 0;}int res .equals(resString) ? 0 : Integer.parseInt(resString);return hasHyphen ? -res: res;
}官方解法数学方法
记rev为翻转后的数字为完成翻转我们可以重复「弹出」x 的末尾数字将其「推入」rev 的末尾直至 x 为 0。
要在没有辅助栈或数组的帮助下「弹出」和「推入」数字我们可以使用如下数学方法
// 弹出 x 的末尾数字 digit
digit x % 10
x / 10// 将数字 digit 推入 rev 末尾
rev rev * 10 digit题目需要判断反转后的数字是否超过 323232 位有符号整数的范围 [ − 2 31 , 2 31 − 1 ] [-2^{31},2^{31}-1] [−231,231−1]。例如 x 2123456789 x2123456789 x2123456789反转后的 r e v 9876543212 2 31 − 1 2147483647 {rev}98765432122^{31}-12147483647 rev9876543212231−12147483647超过了 323232 位有符号整数的范围。
因此我们需要在「推入」数字之前判断是否满足 − 2 31 ≤ r e v ⋅ 10 d i g i t ≤ 2 31 − 1 -2^{31}≤rev⋅10digit≤2^{31}-1 −231≤rev⋅10digit≤231−1
若该不等式不成立则返回 0。
但是题目要求不允许使用 646464 位整数即运算过程中的数字必须在 323232 位有符号整数的范围内因此我们不能直接按照上述式子计算需要另寻他路。
考虑 x0的情况记 I N T _ M A X 2 31 − 1 2147483647 {INT\_MAX}2^{31}-12147483647 INT_MAX231−12147483647由于 则不等式 r e v ⋅ 10 d i g i t ≤ I N T M A X rev⋅10digit≤INT_MAX rev⋅10digit≤INTMAX
等价于 移项得 讨论该不等式成立的条件 注意到当相等时若还能推入数字则说明 x 的位数与 INT_MAX的位数相同且要推入的数字 digit 为 x 的最高位。由于 x 不超过 INT_MAX因此 digit 不会超过 INT_MAX 的最高位即 digit≤2。所以实际上当 相等时不等式必定成立。
因此判定条件可简化为当且仅当小于等于时就成立。
x0 的情况类似。
综上所述判断不等式 − 2 31 ≤ r e v ⋅ 10 d i g i t ≤ 2 31 − 1 -2^{31}≤rev⋅10digit≤2^{31}-1 −231≤rev⋅10digit≤231−1
是否成立可改为判断不等式 I N T M I N / 10 r e v I N T M A X / 10 INT_MIN / 10 rev INT_MAX / 10 INTMIN/10revINTMAX/10
java代码
class Solution {public int reverse(int x) {int rev 0; // 结果数字while (x ! 0) {if (rev Integer.MIN_VALUE / 10 || rev Integer.MAX_VALUE / 10) {return 0;}// 取余数int digit x % 10;// 原数字除以10后得到的商为下一位数字x / 10;// 原来的rev*10等于向高位移动一位再加上余数就是新数字rev rev * 10 digit;}return rev;}
}