Fork me on GitHub

leetcode——[007]Reserver Integer反转整数

题目

给定一个 32 位有符号整数,将整数中的数字进行反转。

示例 1:

1
2
输入: 123
输出: 321

示例 2:

1
2
输入: -123
输出: -321

示例 3:

1
2
输入: 120
输出: 21

注意:

假设我们的环境只能存储 32 位有符号整数,其数值范围是 [−231, 231 − 1]。根据这个假设,如果反转后的整数溢出,则返回 0。

Given a 32-bit signed integer, reverse digits of an integer.

Example 1:

1
2
Input: 123
Output: 321

Example 2:

1
2
Input: -123
Output: -321

Example 3:

1
2
Input: 120
Output: 21

Note:
Assume we are dealing with an environment which could only store integers within the 32-bit signed integer range: [−231, 231 − 1]. For the purpose of this problem, assume that your function returns 0 when the reversed integer overflows.

解题方法

转化为字符串反转

可以将整数转化为字符串,然后按[leetcode——[344]Reverse String反转字符串]来处理,然后再转化为long型整数,判断反转之后是否溢出。这段代码时间复杂度为O(n),n为整数的位数,跑了31ms,超过78.59%的java提交。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Solution {
public int reverse(int x) {
String s = Integer.toString(x);
char[] chars = s.toCharArray();
int start = chars[0] == '-' ? 1 : 0;
int end = chars.length - 1;
while (start < end) {
char tmp = chars[start];
chars[start] = chars[end];
chars[end] = tmp;
start++;
end--;
}
s = new String(chars);
long res = Long.valueOf(s);
if (res > Integer.MAX_VALUE || res < Integer.MIN_VALUE) {
return 0;
}
return (int) res;
}
}

低位逐个进位

使用取余符号%获取整数个位,然后将整数除以10消去各位,循环遍历直至最后整数除以10取整为0,即遍历了每一个数字,每次遍历将原来获取的数字乘以10加上新取得的数字。为了防止整数溢出,结果用long型保留,每次加完新取得的数组进行判断。说的不清楚,还是直接看代码吧,这段代码时间复杂度为O(n),n为整数位数,跑了28ms,超过88.84%的java提交。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Solution {
public int reverse(int x) {
// Method_02 28ms 88.84%
long res = 0;
while (x != 0) {
res = res * 10 + x % 10;
if (res > Integer.MAX_VALUE || res < Integer.MIN_VALUE) {
return 0;
}
x /= 10;
}
return (int) res;
}
}
BJTU-HXS wechat
海内存知己,天涯若比邻。