comments | difficulty | edit_url | tags | |
---|---|---|---|---|
true |
中等 |
|
给你一个 32 位的有符号整数 x
,返回将 x
中的数字部分反转后的结果。
如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1]
,就返回 0。
示例 1:
输入:x = 123 输出:321
示例 2:
输入:x = -123 输出:-321
示例 3:
输入:x = 120 输出:21
示例 4:
输入:x = 0 输出:0
提示:
-231 <= x <= 231 - 1
我们不妨记
我们可以通过不断地对
若
下面我们讨论上述不等式成立的条件:
- 当
$ans \lt \left \lfloor \frac{mx}{10} \right \rfloor$ 时,不等式显然成立; - 当
$ans = \left \lfloor \frac{mx}{10} \right \rfloor$ 时,不等式成立的充要条件是$y \leq 7$ 。如果$ans = \left \lfloor \frac{mx}{10} \right \rfloor$ 并且还能继续添加数字,说明此时数字是最高位,即此时$y$ 一定不超过$2$ ,因此,不等式一定成立; - 当
$ans \gt \left \lfloor \frac{mx}{10} \right \rfloor$ 时,不等式显然不成立。
综上,当
同理,当
因此,我们可以通过判断
时间复杂度
class Solution:
def reverse(self, x: int) -> int:
ans = 0
mi, mx = -(2**31), 2**31 - 1
while x:
if ans < mi // 10 + 1 or ans > mx // 10:
return 0
y = x % 10
if x < 0 and y > 0:
y -= 10
ans = ans * 10 + y
x = (x - y) // 10
return ans
class Solution {
public int reverse(int x) {
int ans = 0;
for (; x != 0; x /= 10) {
if (ans < Integer.MIN_VALUE / 10 || ans > Integer.MAX_VALUE / 10) {
return 0;
}
ans = ans * 10 + x % 10;
}
return ans;
}
}
class Solution {
public:
int reverse(int x) {
int ans = 0;
for (; x; x /= 10) {
if (ans < INT_MIN / 10 || ans > INT_MAX / 10) {
return 0;
}
ans = ans * 10 + x % 10;
}
return ans;
}
};
func reverse(x int) (ans int) {
for ; x != 0; x /= 10 {
if ans < math.MinInt32/10 || ans > math.MaxInt32/10 {
return 0
}
ans = ans*10 + x%10
}
return
}
impl Solution {
pub fn reverse(mut x: i32) -> i32 {
let is_minus = x < 0;
match x
.abs()
.to_string()
.chars()
.rev()
.collect::<String>()
.parse::<i32>()
{
Ok(x) => x * (if is_minus { -1 } else { 1 }),
Err(_) => 0,
}
}
}
/**
* @param {number} x
* @return {number}
*/
var reverse = function (x) {
const mi = -(2 ** 31);
const mx = 2 ** 31 - 1;
let ans = 0;
for (; x != 0; x = ~~(x / 10)) {
if (ans < ~~(mi / 10) || ans > ~~(mx / 10)) {
return 0;
}
ans = ans * 10 + (x % 10);
}
return ans;
};
public class Solution {
public int Reverse(int x) {
int ans = 0;
for (; x != 0; x /= 10) {
if (ans < int.MinValue / 10 || ans > int.MaxValue / 10) {
return 0;
}
ans = ans * 10 + x % 10;
}
return ans;
}
}
int reverse(int x) {
int ans = 0;
for (; x != 0; x /= 10) {
if (ans > INT_MAX / 10 || ans < INT_MIN / 10) {
return 0;
}
ans = ans * 10 + x % 10;
}
return ans;
}
class Solution {
/**
* @param int $x
* @return int
*/
function reverse($x) {
$isNegative = $x < 0;
$x = abs($x);
$reversed = 0;
while ($x > 0) {
$reversed = $reversed * 10 + ($x % 10);
$x = (int) ($x / 10);
}
if ($isNegative) {
$reversed *= -1;
}
if ($reversed < -pow(2, 31) || $reversed > pow(2, 31) - 1) {
return 0;
}
return $reversed;
}
}