384,整数反转
作者:互联网
Take the sourest lemon that life has to offer and turn it into something resembling lemonade.
接过生活中酸涩的柠檬,把它变成酸甜可口的柠檬汽水。
问题描述
给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
示例 1:
输入: 123
输出: 321
示例 2:
输入: -123
输出: -321
示例 3:
输入: 120
输出: 21
问题分析
看到这道题可能我们最容易想到的是先把他转化为一个字符串,然后再进行反转,代码如下
1public int reverse(int x) {
2 boolean negative = x < 0;
3 StringBuilder stringBuilder = new StringBuilder(x + "");
4 if (negative)
5 stringBuilder.deleteCharAt(0);
6 stringBuilder.reverse();
7 long reverseDigit = Long.parseLong(stringBuilder.toString());
8 if (reverseDigit > Integer.MAX_VALUE || reverseDigit < Integer.MIN_VALUE)
9 return 0;
10 if (negative)
11 return (int) -reverseDigit;
12 return (int) reverseDigit;
13}
第3行是先把他转化为字符串;
第6行再对字符串进行反转;
第8-9行如果反转之后大于int表示的范围就返回0;
第10-11行是对符号的处理;
这种也能实现,但效率实在是太低。下面我们就以数字1234为例画个图来看一下,如果不转化为字符串该怎么实现
我们看到上一步的结果在下一步都会先乘以10,然后在加一个个位数就是当前的值,一直这样循环下去,直到全部反转为止。大家可能会怀疑,上面图中分析的是正数,如果是负数该怎么办,其实负数也是一样,大家可以自己画个图看一下。上面的图很容易理解,我们来看下代码
1public int reverse(int x) {
2 long res = 0;
3 while (x != 0) {
4 res = res * 10 + x % 10;
5 x /= 10;
6 }
7 return (int) res == res ? (int) res : 0;
8}
注意这里的res是long类型,在第7行的时候,会把它转化为int类型,如果res的范围大于int类型表示的范围,转化之后是不相等的,直接返回0,如果在int类型表示的范围内,转化之后是相等的,返回转化后的值即可。
长按上图,识别图中二维码之后即可关注。
如果喜欢这篇文章就点个"在看"吧
标签:10,return,int,反转,整数,384,res,reverseDigit 来源: https://blog.51cto.com/u_4774266/2902810