力扣题目
解题思路
java代码
力扣题目:
给你一个 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
解题思路:
算法原理:
通过不断取出整数 x
的末尾数字,将其乘以相应的倍数后累加到结果 result
中,实现整数的反转。
思路:
在循环中,每次通过取模运算获取 x
的末尾数字 pop
,然后将 x
除以 10 去掉末尾数字。在累加之前,需要判断是否会发生溢出。如果累加后会导致溢出,则返回 0 。否则,将 pop
累加到 result
中。
代码分析:
- 在
reverse
方法中,初始化结果result
为 0 。 - 进入循环,只要
x
不为 0 。- 获取末尾数字
pop
,并更新x
。 - 检查累加
pop
到result
时是否会溢出。 - 如果不会溢出,进行累加。
- 获取末尾数字
时间复杂度:O(log|x|),其中 |x|
表示 x
的绝对值。这是因为循环的次数取决于数字的位数,大致为数字的对数。
空间复杂度:O(1),只使用了固定的几个变量,空间开销恒定。
java代码:
package org.example;
public class Leetcode7 {
public static void main(String[] args) {
Leetcode7 leetcode7 = new Leetcode7();
System.out.println(leetcode7.reverse(-123));
}
public int reverse(int x) {
int result = 0;
while (x != 0) {
int pop = x % 10;
x /= 10;
if (result > Integer.MAX_VALUE / 10 || (result == Integer.MAX_VALUE / 10 && pop > 7)) return 0;
if (result < Integer.MIN_VALUE / 10 || (result == Integer.MIN_VALUE / 10 && pop < -8)) return 0;
result = result * 10 + pop;
}
return result;
}
}
更多详细内容同步到公众号,感谢大家的支持!
每天都会给刷算法的小伙伴推送明日一题,并且没有任何收费项