力扣00007.整数反转


题目描述

给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。

如果反转后整数超过 32 位的有符号整数的范围 [$−2^{31}, 2^{31} − 1$] ,就返回 0。

假设环境不允许存储 64 位整数(有符号或无符号)。

示例 1:

输入:x = 123
输出:321

示例 2:

输入:x = -123
输出:-321

示例 3:

输入:x = 120
输出:21

示例 4:

输入:x = 0
输出:0

提示:

  • $-2^{31} <= x <= 2^{31} - 1$

解决方法

C++

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <limits>
class Solution {
public:
int reverse(int x) {
int maximum = std::numeric_limits<int>::max();
int minimum = std::numeric_limits<int>::min();
int sign = (x < 0) ? -1 : 1;
x = abs(x);
long long reversed_num = 0;
while (x != 0) {
int pop = x % 10;
x /= 10;
reversed_num = reversed_num * 10 + pop;
if (reversed_num > maximum || reversed_num < minimum) {
return 0;
}
}
return sign * reversed_num;
}
};

结果

执行用时 : 0 ms, 击败 100.00% 使用 C++ 的用户

内存消耗 : 6.39 MB, 击败 23.92% 使用 C++ 的用户


Java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Solution {
public int reverse(int x) {
int MAX_VALUE = Integer.MAX_VALUE;
int MIN_VALUE = Integer.MIN_VALUE;
int sign = (x < 0) ? -1 : 1;
x = Math.abs(x);
long reversedNum = 0;
while (x != 0) {
int pop = x % 10;
x /= 10;
reversedNum = reversedNum * 10 + pop;
if (reversedNum > MAX_VALUE || reversedNum < MIN_VALUE) {
return 0;
}
}
return (int) (sign * reversedNum);
}
}

结果

执行用时 : 1 ms, 击败 47.24% 使用 Java 的用户

内存消耗 : 39.78 MB, 击败 5.22% 使用 Java 的用户


Python

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Solution(object):
def reverse(self, x):
INT_MAX = 2**31 - 1
INT_MIN = -2**31
sign = -1 if x < 0 else 1
x = abs(x)
reversed_num = 0
while x != 0:
pop = x % 10
x //= 10
if reversed_num > INT_MAX // 10 or (reversed_num == INT_MAX // 10 and pop > 7):
return 0
if reversed_num < INT_MIN // 10 or (reversed_num == INT_MIN // 10 and pop < -8):
return 0
reversed_num = reversed_num * 10 + pop
return sign * reversed_num

结果

执行用时 : 28 ms, 击败 42.98% 使用 Python 的用户

内存消耗 : 13.20 MB, 击败 5.80% 使用 Python 的用户


Python3

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Solution:
def reverse(self, x: int) -> int:
INT_MAX = 2**31 - 1
INT_MIN = -2**31
sign = -1 if x < 0 else 1
x = abs(x)
reversed_num = 0
while x != 0:
pop = x % 10
x //= 10
if reversed_num > INT_MAX // 10 or (reversed_num == INT_MAX // 10 and pop > 7):
return 0
if reversed_num < INT_MIN // 10 or (reversed_num == INT_MIN // 10 and pop < -8):
return 0
reversed_num = reversed_num * 10 + pop
return sign * reversed_num

结果

执行用时 : 32 ms, 击败 98.79% 使用 Python3 的用户

内存消耗 : 16.86 MB, 击败 5.02% 使用 Python3 的用户


C

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int reverse(int x) {
int reversed = 0;
int upper_limit = INT_MAX / 10;
int lower_limit = INT_MIN / 10;
while (x != 0) {
int digit = x % 10;
x /= 10;
if (reversed > upper_limit || (reversed == upper_limit && digit > 7)) {
return 0;
}
if (reversed < lower_limit || (reversed == lower_limit && digit < -8)) {
return 0;
}
reversed = reversed * 10 + digit;
}
return reversed;
}

结果

执行用时 : 0 ms, 击败 100.00% 使用 C 的用户

内存消耗 : 6.21 MB, 击败 50.59% 使用 C 的用户


C#

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class Solution {
public int Reverse(int x) {
int reversed = 0;
while (x != 0) {
int digit = x % 10;
x /= 10;
if (reversed > int.MaxValue / 10 || (reversed == int.MaxValue / 10 && digit > 7)) {
return 0;
}
if (reversed < int.MinValue / 10 || (reversed == int.MinValue / 10 && digit < -8)) {
return 0;
}
reversed = reversed * 10 + digit;
}
return reversed;
}
}

结果

执行用时 : 20 ms, 击败 89.43% 使用 C# 的用户

内存消耗 : 25.87 MB, 击败 95.35% 使用 C# 的用户


JavaScript

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/**
* @param {number} x
* @return {number}
*/
var reverse = function(x) {
let reversed = 0;
const INT_MAX = Math.pow(2, 31) - 1;
const INT_MIN = -Math.pow(2, 31);
while (x !== 0) {
const digit = x % 10;
x = Math.trunc(x / 10);
if (reversed > INT_MAX / 10 || (reversed === INT_MAX / 10 && digit > 7)) {
return 0;
}
if (reversed < INT_MIN / 10 || (reversed === INT_MIN / 10 && digit < -8)) {
return 0;
}
reversed = reversed * 10 + digit;
}
return reversed;
};

结果

执行用时 : 68 ms, 击败 77.92% 使用 JavaScript 的用户

内存消耗 : 42.45 MB, 击败 75.56% 使用 JavaScript 的用户


TypeScript

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
function reverse(x: number): number {
let reversed = 0;
const INT_MAX = Math.pow(2, 31) - 1;
const INT_MIN = -Math.pow(2, 31);
while (x !== 0) {
const digit = x % 10;
x = Math.trunc(x / 10);
if (reversed > INT_MAX / 10 || (reversed === INT_MAX / 10 && digit > 7)) {
return 0;
}
if (reversed < INT_MIN / 10 || (reversed === INT_MIN / 10 && digit < -8)) {
return 0;
}
reversed = reversed * 10 + digit;
}
return reversed;
}

结果

执行用时 : 80 ms, 击败 35.94% 使用 TypeScript 的用户

内存消耗 : 43.93 MB, 击败 75.78% 使用 TypeScript 的用户


PHP

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class Solution {
/**
* @param Integer $x
* @return Integer
*/
function reverse($x) {
$reversed = 0;
$INT_MAX = pow(2, 31) - 1;
$INT_MIN = -pow(2, 31);
while ($x != 0) {
$digit = $x % 10;
$x = (int)($x / 10);
if ($reversed > $INT_MAX / 10 || ($reversed == $INT_MAX / 10 && $digit > 7)) {
return 0;
}
if ($reversed < $INT_MIN / 10 || ($reversed == $INT_MIN / 10 && $digit < -8)) {
return 0;
}
$reversed = $reversed * 10 + $digit;
}
return $reversed;
}
}

结果

执行用时 : 8 ms, 击败 68.57% 使用 PHP 的用户

内存消耗 : 19.14 MB, 击败 5.72% 使用 PHP 的用户


Swift

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class Solution {
func reverse(_ x: Int) -> Int {
var reversed = 0
let INT_MAX = Int32.max
let INT_MIN = Int32.min
var mutableX = x
while mutableX != 0 {
let digit = mutableX % 10
mutableX /= 10
if reversed > INT_MAX / 10 || (reversed == INT_MAX / 10 && digit > 7) {
return 0
}
if reversed < INT_MIN / 10 || (reversed == INT_MIN / 10 && digit < -8) {
return 0
}
reversed = reversed * 10 + digit
}
return reversed
}
}

结果

执行用时 : 8 ms, 击败 22.22% 使用 Swift 的用户

内存消耗 : 14.84 MB, 击败 5.56% 使用 Swift 的用户


Kotlin

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class Solution {
fun reverse(x: Int): Int {
var reversed = 0
val INT_MAX = Int.MAX_VALUE
val INT_MIN = Int.MIN_VALUE
var mutableX = x
while (mutableX != 0) {
val digit = mutableX % 10
mutableX /= 10
if (reversed > INT_MAX / 10 || (reversed == INT_MAX / 10 && digit > 7)) {
return 0
}
if (reversed < INT_MIN / 10 || (reversed == INT_MIN / 10 && digit < -8)) {
return 0
}
reversed = reversed * 10 + digit
}
return reversed
}
}

结果

执行用时 : 132 ms, 击败 93.18% 使用 Kotlin 的用户

内存消耗 : 32.98 MB, 击败 70.45% 使用 Kotlin 的用户


Dart

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class Solution {
int reverse(int x) {
if (x > -10 && x < 10) {
return x;
}
int res = 0;
final minInt = -2147483648;
final maxInt = 2147483647;
int sign = 1;
if (x < 0) {
sign = -1;
x = -x;
}
while (x != 0) {
if (sign * res < minInt ~/ 10 || sign * res > maxInt ~/ 10) {
return 0;
}
res = res * 10 + x % 10;
x ~/= 10;
}
return sign * res;
}
}

结果

执行用时 : 312 ms, 击败 50.00% 使用 Dart 的用户

内存消耗 : 148.46 MB, 击败 90.00% 使用 Dart 的用户


Go

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
func reverse(x int) int {
if x > -10 && x < 10 {
return x
}
res := 0
minInt := -2147483648
maxInt := 2147483647
sign := 1
if x < 0 {
sign = -1
x = -x
}
for x != 0 {
if sign*res < minInt/10 || sign*res > maxInt/10 {
return 0
}
res = res*10 + x%10
x /= 10
}
return sign * res
}

结果

执行用时 : 4 ms, 击败 26.89% 使用 Go 的用户

内存消耗 : 2.02 MB, 击败 23.89% 使用 Go 的用户


Ruby

1
2
3
4
5
6
7
8
9
10
11
12
13
# @param {Integer} x
# @return {Integer}
def reverse(x)
abs = 1
abs = -1 if x < 0
reversed = x.abs.to_s.reverse.to_i * abs

if -2**31 <= reversed && reversed < 2**31
return reversed
else
return 0
end
end

结果

执行用时 : 52 ms, 击败 100.00% 使用 Ruby 的用户

内存消耗 : 206.73 MB, 击败 -% 使用 Ruby 的用户


Scala

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
object Solution {
def reverse(x: Int): Int = {
if (x > -10 && x < 10) {
return x
}
val minInt = -2147483648
val maxInt = 2147483647
var reversed = 0
var num = x
var sign = 1
if (x < 0) {
sign = -1
num = -x
}
while (num != 0) {
val digit = num % 10
num /= 10
if (sign * reversed < minInt / 10 || sign * reversed > maxInt / 10) {
return 0
}
reversed = reversed * 10 + digit
}
sign * reversed
}
}

结果

执行用时 : 424 ms, 击败 66.67% 使用 Scala 的用户

内存消耗 : 51.57 MB, 击败 16.67% 使用 Scala 的用户


Rust

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
impl Solution {
pub fn reverse(x: i32) -> i32 {
if x > -10 && x < 10 {
return x;
}
let min_int = i32::MIN;
let max_int = i32::MAX;
let mut reversed = 0;
let mut num = x;
let mut sign = 1;
if x < 0 {
sign = -1;
num = -x;
}
while num != 0 {
let digit = num % 10;
num /= 10;
if sign * reversed < min_int / 10 || sign * reversed > max_int / 10 {
return 0;
}
reversed = reversed * 10 + digit;
}
sign * reversed
}
}

结果

执行用时 : 0 ms, 击败 100.00% 使用 Rust 的用户

内存消耗 : 2.16 MB, 击败 16.03% 使用 Rust 的用户


Racket

1
2
3
4
5
6
7
8
9
10
11
12
13
14
(define (reverse x)
(define _reverse
(lambda (ls)
(if (null? ls)
'()
(append (_reverse (cdr ls)) (list (car ls))))))
(let* ((to-list (string->list (number->string (abs x))))
(reversed-list (_reverse to-list))
(reversed-str (list->string reversed-list))
(reversed-num (string->number reversed-str))
(reversed (if (< x 0) (- 0 reversed-num) reversed-num)))
(if (and (>= reversed -2147483648) (<= reversed 2147483647))
reversed
0)))

结果

执行用时 : 216 ms, 击败 100.00% 使用 Racket 的用户

内存消耗 : 98.86 MB, 击败 100.00% 使用 Racket 的用户


Erlang

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
-export([reverse/1]).
reverse(X) when X >= -9, X =< 9 ->
X;
reverse(X) ->
Sign = if X < 0 -> -1; true -> 1 end,
AbsX = abs(X),
Reversed = reverse_helper(AbsX, 0),
case Reversed * Sign of
Result when Result >= -2147483648, Result =< 2147483647 -> Result;
_ -> 0
end.
reverse_helper(0, Acc) ->
Acc;
reverse_helper(X, Acc) ->
Digit = X rem 10,
NewAcc = Acc * 10 + Digit,
NewX = X div 10,
reverse_helper(NewX, NewAcc).

结果

执行用时 : 256 ms, 击败 -% 使用 Erlang 的用户

内存消耗 : 55.36 MB, 击败 -% 使用 Erlang 的用户


Elixir

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
defmodule Solution do
@spec reverse(x :: integer) :: integer
def reverse(x) when x in -9..9 do
x
end
def reverse(x) do
sign = if x < 0, do: -1, else: 1
abs_x = abs(x)
reversed = reverse_helper(abs_x, 0)

case reversed * sign do
result when result >= -2147483648 and result <= 2147483647 -> result
_ -> 0
end
end
defp reverse_helper(0, acc), do: acc
defp reverse_helper(x, acc) do
digit = rem(x, 10)
new_acc = acc * 10 + digit
new_x = div(x, 10)
reverse_helper(new_x, new_acc)
end
end

结果

执行用时 : 304 ms, 击败 100.00% 使用 Elixir 的用户

内存消耗 : 68.14 MB, 击败 100.00% 使用 Elixir 的用户