一、题目
LeetCode-7.整数反转
链接:https://leetcode-cn.com/problems/reverse-integer/
难度:简单
给你一个32
位的有符号整数x
,返回将x
中的数字部分反转后的结果。
如果反转后整数超过32位的有符号整数的范围 [−2^31, 2^31 − 1]
,就返回 0。
假设环境不允许存储 64 位整数(有符号或无符号)。
示例 1:
输入:x = 123
输出:321
示例 2:
输入:x = -123
输出:-321
示例 3:
输入:x = 120
输出:21
提示:
-2^31 <= x <= 2^31 - 1
二、解题思路
首先我们想一下,怎么去反转一个整数?
把整数变成字符串,再去反转这个字符串吗?
这种方法是可以的,但是并不好。实际上我们只要能拿到这个整数的末尾数字
就可以了。
以123为例,先拿到3,再拿到2,最后是1,然后按照顺序拼接就达到反转的效果了。
那么问题又来了,怎么拿到末尾数字呢?这个比较简单,取模就好了。
本题还要考虑负数的情况,所以判断条件不是x>0
,而是x!=0
。
最后就是判断反转后的数是否会溢出,这个直接和32位的有符号整数214748364
比较就行了。
三、实现过程
c++
class Solution {
public:
int reverse(int x) {
int res = 0;
while(x!=0){
//每次取末尾数字
int tmp = x%10;
//判断是否 大于 最大32位整数
if (res>214748364 || (res==214748364 && tmp>7)) {
return 0;
}
//判断是否 小于 最小32位整数
if (res<-214748364 || (res==-214748364 && tmp<-8)) {
return 0;
}
res = res*10 + tmp;
x /= 10;
}
return res;
}
};
PHP
class Solution {
/**
* @param Integer $x
* @return Integer
*/
function reverse($x) {
$res = 0;
while ($x) {
$res = $res * 10 + ($x % 10);
if ($res > 2147483647 || $res < -2147483647) return 0;
$x = intval($x / 10);
}
return $res;
}
}
JavaScript
/**
* @param {number} x
* @return {number}
*/
var reverse = function(x) {
let res = 0;
while (x) {
res = res * 10 + (x % 10);
if (res > 2147483647 || res < -2147483647) return 0;
x = parseInt(x / 10);
}
return res;
};
四、小结
- 时间复杂度:O(log∣x∣)。翻转的次数即x十进制的位数。
- 空间复杂度:O(1)