力扣00009.回文数


题目描述

给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。

回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。

例如,121 是回文,而 123 不是。

示例 1:

输入:x = 121
输出:true

示例 2:

输入:x = -121
输出:false
解释:从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。

示例 3:

输入:x = 10
输出:false
解释:从右向左读, 为 01 。因此它不是一个回文数。

提示:

  • $-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
class Solution {
public:
bool isPalindrome(int x) {
if (x < 0) {
return false;
}
std::string strX = std::to_string(x);
int left = 0;
int right = strX.length() - 1;
while (left < right) {
if (strX[left] != strX[right]) {
return false;
}
left++;
right--;
}
return true;
}
};

结果

执行用时 : 12 ms, 击败 52.12% 使用 C++ 的用户

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


Java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Solution {
public boolean isPalindrome(int x) {
if (x < 0) {
return false;
}
String strX = String.valueOf(x);
int left = 0;
int right = strX.length() - 1;
while (left < right) {
if (strX.charAt(left) != strX.charAt(right)) {
return false;
}
left++;
right--;
}
return true;
}
}

结果

执行用时 : 6 ms, 击败 55.42% 使用 Java 的用户

内存消耗 : 42.70 MB, 击败 9.49% 使用 Java 的用户


Python

1
2
3
4
5
6
7
8
9
10
11
12
13
class Solution(object):
def isPalindrome(self, x):
if x < 0:
return False
str_x = str(x)
left = 0
right = len(str_x) - 1
while left < right:
if str_x[left] != str_x[right]:
return False
left += 1
right -= 1
return True

结果

执行用时 : 82 ms, 击败 81.38% 使用 Python 的用户

内存消耗 : 12.87 MB, 击败 85.78% 使用 Python 的用户


Python3

1
2
3
4
5
6
7
8
9
10
11
12
13
class Solution:
def isPalindrome(self, x: int) -> bool:
if x < 0:
return False
str_x = str(x)
left = 0
right = len(str_x) - 1
while left < right:
if str_x[left] != str_x[right]:
return False
left += 1
right -= 1
return True

结果

执行用时 : 56 ms, 击败 92.88% 使用 Python3 的用户

内存消耗 : 17.05 MB, 击败 5.11% 使用 Python3 的用户


C

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdbool.h>

bool isPalindrome(int x) {
if (x < 0) {
return false;
}
long long reversed = 0;
int original = x;
while (x > 0) {
int digit = x % 10;
reversed = reversed * 10LL + digit;
x /= 10;
}
return original == reversed;
}

结果

执行用时 : 8 ms, 击败 77.34% 使用 C 的用户

内存消耗 : 6.36 MB, 击败 88.88% 使用 C 的用户


C#

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class Solution {
public bool IsPalindrome(int x) {
if (x < 0) {
return false;
}
int original = x;
int reversed = 0;
while (x != 0) {
int digit = x % 10;
reversed = reversed * 10 + digit;
x /= 10;
}
return original == reversed;
}
}

结果

执行用时 : 44 ms, 击败 51.96% 使用 C# 的用户

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


JavaScript

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/**
* @param {number} x
* @return {boolean}
*/
var isPalindrome = function(x) {
if (x < 0) {
return false;
}
let original = x;
let reversed = 0;
while (x > 0) {
let digit = x % 10;
reversed = reversed * 10 + digit;
x = Math.floor(x / 10);
}
return original === reversed;
};

结果

执行用时 : 172 ms, 击败 25.28% 使用 JavaScript 的用户

内存消耗 : 55.16 MB, 击败 6.23% 使用 JavaScript 的用户


TypeScript

1
2
3
4
5
6
7
8
9
10
11
12
13
function isPalindrome(x: number): boolean {
if (x < 0) {
return false;
}
let original = x;
let reversed = 0;
while (x > 0) {
const digit = x % 10;
reversed = reversed * 10 + digit;
x = Math.floor(x / 10);
}
return original === reversed;
}

结果

执行用时 : 144 ms, 击败 78.49% 使用 TypeScript 的用户

内存消耗 : 55.14 MB, 击败 7.92% 使用 TypeScript 的用户


PHP

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Solution {
/**
* @param Integer $x
* @return Boolean
*/
function isPalindrome($x) {
if ($x < 0) {
return false;
}
$original = $x;
$reversed = 0;
while ($x > 0) {
$digit = $x % 10;
$reversed = $reversed * 10 + $digit;
$x = intval($x / 10);
}
return $original === $reversed;
}
}

结果

执行用时 : 28 ms, 击败 68.75% 使用 PHP 的用户

内存消耗 : 19.27 MB, 击败 9.38% 使用 PHP 的用户


Swift

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Solution {
func isPalindrome(_ x: Int) -> Bool {
if x < 0 {
return false
}
var original = x
var reversed = 0
var num = x
while num > 0 {
let digit = num % 10
reversed = reversed * 10 + digit
num /= 10
}
return original == reversed
}
}

结果

执行用时 : 28 ms, 击败 79.49% 使用 Swift 的用户

内存消耗 : 15.09 MB, 击败 5.13% 使用 Swift 的用户


Kotlin

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Solution {
fun isPalindrome(x: Int): Boolean {
if (x < 0) {
return false
}
var original = x
var reversed = 0
var num = x
while (num > 0) {
val digit = num % 10
reversed = reversed * 10 + digit
num /= 10
}
return original == reversed
}
}

结果

执行用时 : 200 ms, 击败 85.11% 使用 Kotlin 的用户

内存消耗 : 35.91 MB, 击败 45.75% 使用 Kotlin 的用户


Dart

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Solution {
bool isPalindrome(int x) {
if (x < 0) {
return false;
}
String strX = x.toString();
int left = 0;
int right = strX.length - 1;
while (left < right) {
if (strX[left] != strX[right]) {
return false;
}
left++;
right--;
}
return true;
}
}

结果

执行用时 : 496 ms, 击败 11.76% 使用 Dart 的用户

内存消耗 : 146.45 MB, 击败 100.00% 使用 Dart 的用户


Go

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
func isPalindrome(x int) bool {
if x < 0 {
return false
}
strX := strconv.Itoa(x)
left, right := 0, len(strX)-1
for left < right {
if strX[left] != strX[right] {
return false
}
left++
right--
}
return true
}

结果

执行用时 : 12 ms, 击败 66.98% 使用 Go 的用户

内存消耗 : 4.36 MB, 击败 22.27% 使用 Go 的用户


Ruby

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# @param {Integer} x
# @return {Boolean}
def is_palindrome(x)
return false if x < 0
str_x = x.to_s
left = 0
right = str_x.length - 1
while left < right
return false if str_x[left] != str_x[right]
left += 1
right -= 1
end
true
end

结果

执行用时 : 88 ms, 击败 69.23% 使用 Ruby 的用户

内存消耗 : 206.53 MB, 击败 7.69% 使用 Ruby 的用户


Scala

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
object Solution {
def isPalindrome(x: Int): Boolean = {
if (x < 0) {
false
} else {
val strX = x.toString
val len = strX.length
var left = 0
var right = len - 1
while (left < right) {
if (strX(left) != strX(right)) {
return false
}
left += 1
right -= 1
}
true
}
}
}

结果

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

内存消耗 : 52.84 MB, 击败 79.17% 使用 Scala 的用户


Rust

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
impl Solution {
pub fn is_palindrome(x: i32) -> bool {
if x < 0 {
return false;
}
let mut num = x;
let mut reversed = 0;
let original = x;
while num != 0 {
let digit = num % 10;
reversed = reversed * 10 + digit;
num /= 10;
}
original == reversed
}
}

结果

执行用时 : 4 ms, 击败 76.59% 使用 Rust 的用户

内存消耗 : 2.08 MB, 击败 38.68% 使用 Rust 的用户


Racket

1
2
3
4
5
6
7
8
9
(define (is-palindrome x)
(define (reverse-number n)
(let loop ((num n) (reversed 0))
(if (= num 0)
reversed
(loop (quotient num 10) (+ (* reversed 10) (remainder num 10))))))
(if (< x 0)
#f
(= x (reverse-number x))))

结果

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

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


Erlang

1
2
3
4
5
6
7
8
9
10
11
12
-export([is_palindrome/1]).
is_palindrome(X) when X < 0 ->
false;
is_palindrome(X) ->
is_palindrome(X, 0, X).
is_palindrome(0, Rev, Original) ->
Original =:= Rev;
is_palindrome(Num, Rev, Original) ->
Digit = Num rem 10,
NewRev = Rev * 10 + Digit,
NewNum = Num div 10,
is_palindrome(NewNum, NewRev, Original).

结果

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

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


Elixir

1
2
3
4
5
6
7
8
9
10
11
12
13
14
defmodule Solution do
@spec is_palindrome(x :: integer) :: boolean
def is_palindrome(x) when x < 0, do: false
def is_palindrome(x) do
is_palindrome(x, 0, x)
end
defp is_palindrome(0, rev, original), do: original == rev
defp is_palindrome(num, rev, original) do
digit = rem(num, 10)
new_rev = rev * 10 + digit
new_num = div(num, 10)
is_palindrome(new_num, new_rev, original)
end
end

结果

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

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