给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。
如果反转后整数超过 32 位的有符号整数的范围 [?231, 231 ? 1] ,就返回 0。
public static int reverse1(int x) { if (x == 0) { return 0; } else { String temp = String.valueOf(x); StringBuilder sb = new StringBuilder(); int length = temp.length(); if (x > 0) { for (int i = 0; i < length; i++) { sb.append(temp.charAt(length - i - 1)); } return Integer.valueOf(sb.toString()); } else { for (int i = 0; i < length - 1; i++) { sb.append(temp.charAt(length - i - 1)); } return -Integer.valueOf(sb.toString()); } } }
这个没有特殊技巧,就是一般实际工作中常见的思路,提出需求你,按需求思路解决需求。
public int reverse(int x) { long n = 0; while(x != 0) { n = n * 10 + x % 10; x = x / 10; } return (int)n==n? (int)n:0; }
结题思路:
由于int反转后,可能会超过int最大值,所以使用long存储中间值,最后用强转后对比值大小判断是否有值溢出
从后往前,每次取到除以10的余数,每次循环一次,将上次所得值乘以10.
不使用long,使用算数运算避免字符串操作
public static int reverse(int x) { if (x == 0) { return 0; } else { int ret = 0; while (x != 0) { int temp = ret; ret = (ret * 10) + (x % 10); if (temp != ret / 10) return 0; x = x / 10; } return ret; } }
注意点:
if (temp != ret / 10)一定要在加法完成后计算是否越界,有些算法喜欢直接在上一步就比较是否大于int.maxvalue和小于int.minvalue,这是错的,因为java溢出继续添加,并不会报错,而是会继续进位。
原文:https://www.cnblogs.com/pingpingliao/p/14540791.html