查看原文
其他

384,整数反转

山大王wld 数据结构和算法 2022-05-01

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类型表示的范围内,转化之后是相等的,返回转化后的值即可。


380,缺失的第一个正数(中)

381,合并两个有序链表(易)

377,调整数组顺序使奇数位于偶数前面

376,动态规划之编辑距离


长按上图,识别图中二维码之后即可关注。


如果喜欢这篇文章就点个"在看"吧

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存