LeetCode 7. Reverse Integer

来源:互联网 发布:虚拟拍照软件 编辑:程序博客网 时间:2024/06/14 07:47

本题出处 来自LeetCode Algorithms中的一道Easy的题
原题目:

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.

看完题目,可以知道这道题目要让我们做的事情其实很简单。将输入的整数的各位逆序一下。例如,输入了数字”123”,原来排在最高位的数字”1”,经过我们的算法后,被排在了最低位;排在次高位的数字”2”,经过我们的算法后,被排在了次低位……聪明的你肯定知道我们到底要做些什么了。

看看有哪些是可能出现问题的地方。题目中特地说了如果出现溢出(overflow),返回结果0,这提示我们,要检测溢出现象的发生。另外,我们再考虑当输入是”900”的时候,应该reverse成多少呢? 答案要求我们reverse成”9”,并非”009”,这告诉我们,做法不可以是将输入当作纯字符,并通过字符串的倒序来完成这个任务。

我们试着模拟人处理这个问题的流程,以输入为”901”为例。

我们会首先查看输入的最高位”9”,并将”9”记录下来,写在结果的最低位;

然后接着查看输入的次高位”0”,发现是特殊的数字”0”,那要不要将”0”写到结果中? 我想你一定会写的,因为知道这个是需要的。为什么是需要的? 因为”0”之后,需要往结果的更高位补充的非零数字”1”。 那么, 这个”为什么需要”,就是判断条件的来源了。

最后处理输入的最低位”1”,将它写在结果的最高位。

那么,经过人的模拟,能不能将这个过程抽象为可执行的代码了呢? 这部分就让读者自行尝试了。


下面我要说说另外一种简洁直接的解法了。

无论是使用哪种方法解决这个问题,必不可少的一步,都将是从输入中分离出各位的数字。例如输入”901”,必定要将”9”、”0”、”1”分离出来。我们会怎样分离呢? 可以通过对输入a 取模(对10取模)的方式得到最低位,然后再将a /= 10,将已经得到的最低位去掉。重复这个操作,就可以将各位数字都分离出来。

那可以如何构造我们的结果,当记录好了已分离的各位的数字。可以将获得的第一个数字”1”先加入结果b中,然后b乘以10,然后将获得的第二个数字”0”也加入到b中,再将结果b乘以10。重复这样的操作。(构造结果的操作其实是受到了分离数字时的启发,是类似的逆过程)。

分析到了这里,思路已经大体清晰了,接下来就是coding的问题了。

int reverse(int x) {        long long int ret = 0;        while (x != 0) {            ret *= 10;            ret += x%10;            x /= 10;        }        if (ret > INT_MAX || ret < INT_MIN) return 0;        return ret;    }

复杂度的分析:
1.时间复杂度:O(n),n位输入的数字的位数
2.空间复杂度:O(1)

原创粉丝点击