-
Notifications
You must be signed in to change notification settings - Fork 2
/
palindrome-number.rs
59 lines (48 loc) · 1.85 KB
/
palindrome-number.rs
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#![allow(dead_code, unused, unused_variables)]
fn main() {}
struct Solution;
impl Solution {
/// 常规解法,将数字转化为字符串,然后挨个比较
pub fn is_palindrome1(x: i32) -> bool {
if x < 0 {
return false;
}
if x < 10 {
return true;
}
let s = x.to_string().into_bytes();
let (mut i1, mut i2) = (0, s.len() - 1);
while i1 < i2 {
if s[i1] != s[i2] {
return false;
}
i1 += 1;
i2 -= 1;
}
true
}
///第二个想法是将数字本身反转,然后将反转后的数字与原始数字进行比较,如果它们是相同的,那么这个数字就是回文。
/// 但是,如果反转后的数字大于 \text{int.MAX}int.MAX,我们将遇到整数溢出问题。
///
/// 按照第二个想法,为了避免数字反转可能导致的溢出问题,为什么不考虑只反转 \text{int}int 数字的一半?毕竟,如果该数字是回文,其后半部分反转后应该与原始数字的前半部分相同。
///
/// 例如,输入 1221,我们可以将数字 “1221” 的后半部分从 “21” 反转为 “12”,并将其与前半部分 “12” 进行比较,因为二者相同,我们得知数字 1221 是回文。
pub fn is_palindrome(x: i32) -> bool {
// 所有小于10的都是
if x < 10 && x >= 0 {
return true;
}
// 所有个位数有0的,即可以被10整除的都不是,例如1110
if x < 0 || x % 10 == 0 {
return false;
}
let mut x = x;
let mut r = 0;
while x > r {
r = x % 10 + r * 10;
x /= 10;
}
// 数字为12321时,r 为123, x为12,因此r要处以10
x == r || r / 10 == x
}
}