原题地址:. - 力扣(LeetCode)
题目描述:
给你一个 32 位的有符号整数
x
,返回将x
中的数字部分反转后的结果。如果反转后整数超过 32 位的有符号整数的范围
[−231, 231 − 1]
,就返回 0。假设环境不允许存储 64 位整数(有符号或无符号)。
示例 1:
输入:x = 123 输出:321
示例 2:
输入:x = -123 输出:-321
示例 3:
输入:x = 120 输出:21
示例 4:
输入:x = 0 输出:0
提示:
-231 <= x <= 231 - 1
解题思路
- 首先,我们检查输入的整数是否为0,如果是,直接返回0。
- 将整数转换为字符串,这样我们可以轻松地处理正负号和每一位数字。
- 检查字符串中是否包含负号,如果包含,设置一个标志变量
flag
为true
。 - 使用一个栈来存储每一位数字。我们遍历字符串中的每个字符(去掉负号后的数字),并将它们压入栈中。
- 使用
StringBuilder
来构建反转后的字符串。我们从栈中弹出所有元素,并添加到StringBuilder
中,实现反转。 - 最后,我们尝试将反转后的字符串转换回整数。如果原数为负数,我们需要在反转后的字符串前加上负号。如果转换失败(例如,反转后的数超出了整数的范围),我们返回0。
时间复杂度
时间复杂度是 O(n),其中 n 是输入整数的位数。这是因为我们需要遍历整个字符串一次,将每个字符压入栈中,然后再从栈中弹出。
空间复杂度
空间复杂度是 O(n),因为我们使用了一个栈来存储每一位数字,以及一个StringBuilder
来构建反转后的字符串。在最坏的情况下,这两个数据结构都需要存储 n 个字符。
java
class Solution {
/**
* 将一个整数进行反转。
* @param x 需要反转的整数
* @return 反转后的整数
*/
public int reverse(int x) {
// 如果输入为0,直接返回0
if(x == 0) {
return x;
}
// 将整数转换为字符串,方便处理正负号和每一位数字
String b = String.valueOf(x);
// 标记是否为负数
boolean flag = false;
if(b.indexOf("-") >= 0) {
flag = true;
}
// 使用栈来存储每一位数字,栈的特性是后进先出,方便我们反转数字
Stack<Character> stack = new Stack<>();
// 将字符串中的每个字符(数字)压入栈中,如果原数为负数,则去掉负号
for(char c : b.replace("-", "").toCharArray()) {
stack.push(c);
}
// 使用StringBuilder来构建反转后的字符串,它比字符串拼接更高效
StringBuilder sb = new StringBuilder();
// 从栈中弹出所有元素,并添加到StringBuilder中,实现反转
while(!stack.isEmpty()) {
Character c = stack.pop();
sb.append(c);
}
// 尝试将反转后的字符串转换回整数
try {
// 如果原数为负数,则在反转后的字符串前加上负号
if(flag) {
return Integer.parseInt("-" + sb.toString());
} else {
// 否则直接转换
return Integer.parseInt(sb.toString());
}
} catch(Exception e) {
// 如果转换失败(例如超出整数范围),则返回0
return 0;
}
}
}