LeetCode 第7题
给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
示例 1: 输入: 123 输出: 321
示例 2: 输入: -123 输出: -321
示例 3: 输入: 120 输出: 21
注意: 假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−2^31, 2^31 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。
一开始的思路是把数字取模然后放到int数组里,但是这样复杂又难实现,时间复杂度上也没优势
后来看到网络上的答案,思路是这样的: 首先把要判断这个数是否超范围 然后再把这个数x拿来取模,获得最后一个数并赋值给一个新的变量 然后x自除10,进入下一次循环 第二次循环的时候新变量自乘10再加取模得到的数。最后返回这个新变量
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| class Solution {
public int reverse(int x) {
int rev = 0; //新变量
while (x != 0) {
//判断我们取得的数是否超范围
// 2^31-1 = 2147483647 | -2^31 = -2147483648
if (rev > Integer.MAX_VALUE/10 || (rev == Integer.MAX_VALUE / 10 && pop > 7)) return 0;
if (rev < Integer.MIN_VALUE/10 || (rev == Integer.MIN_VALUE / 10 && pop < -8)) return 0;
int pop = x % 10; //取模拿到个位数
rev = rev * 10 + pop; //自身×10空出个位,然后加上刚刚取模出来的数
x /= 10; //迭代条件。因为x是int类型,所以÷10以后小数点就被省略了
}
return rev;
}
}
|
这种思路,就不需要把数字切成一个一个再拼接。直接利用数字的特性,通过取模和乘除运算带达到效果。
- 时间复杂度:O(log(x)),x 中大约有 log{10}(x)位数字。
- 空间复杂度:O(1)