LeetCode #7 Reverse Integer

来源:互联网 发布:java 股票指标算法库 编辑:程序博客网 时间:2024/06/10 04:47

题目

Reverse digits of an integer.

Example1: x = 123, return 321
Example2: x = -123, return -321

Note:
The input is assumed to be a 32-bit signed integer. Your function should return 0 when the reversed integer overflows.

解题思路

这道题一般会有两种思路:一是把输入的整数转化为字符串,再进行字符串倒转操作;二是对输入的整数每次对10进行取模,依次取出从最低位到最高位的数字,每次相加时,先把之前得到的结果 ×10 后再加上当前的数字,最终得到倒转的整数。

如果用第一种方法,对于末尾是 0 的整数(比如 1000100)的倒转操作比较麻烦,并且在判断倒转后的数是否溢出时也比较麻烦(如 2047483649 倒转后是 9463847402,超出了32位整数所能表示的范围),因此考虑用第二种方法。第二种方法可以自动忽略掉整数末尾的 0,但是仍然要处理倒转后溢出的问题。

我自己在答题的时候踩过的坑就是:判断溢出不能仅仅依靠符号的改变(比如正数加了一个正数后变成负数),有些过大的正数溢出以后也会变成正数,比如 int 类型的 9452457836 程序输出后得到 862523244 。解决这个问题的方法是,把一个数进行某个操作后得到一个结果,把这个结果进行逆操作后如果能够恢复到原来的数,说明这个操作没有溢出。

Java代码实现

class Solution {    public int reverse(int x) {        int rst = 0;        while (x != 0) {            // 先用临时变量tmp保存运算后的结果            int tmp = rst * 10 + x % 10;            // 当结果进行逆操作后无法恢复,说明已经溢出            if (tmp / 10 != rst)                return 0;            rst = tmp;            x /= 10;         }        return rst;    }}

另外需要提醒自己的就是负数取模以后还是得到负数,比如 (-48 % 10 == -8),因此对于负数来说,上述代码也是正确的。

原创粉丝点击