leetcode_rust/problems_cn/p000_0xx/p000_009.rs
1//! # 问题描述
2//!
3//! 给你一个整数 `x` ,如果 `x` 是一个回文整数,返回 `true` ;否则,返回 `false` 。
4//!
5//! 回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
6//!
7//! 例如,`121` 是回文,而 `123` 不是。
8//!
9//!
10//! 示例 1:
11//!
12//! ```plain
13//! 输入:x = 121
14//! 输出:true
15//! ```
16//!
17//! 示例 2:
18//!
19//! ```plain
20//! 输入:x = -121
21//! 输出:false
22//! 解释:从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。
23//! ```
24//!
25//! 示例 3:
26//!
27//! ```plain
28//! 输入:x = 10
29//! 输出:false
30//! 解释:从右向左读, 为 01 。因此它不是一个回文数。
31//! ```
32//!
33//! 提示:
34//!
35//! - $-2^{31} \leqslant x \leqslant 2^{31} - 1$
36//!
37//! 来源:<https://leetcode.cn/problems/palindrome-number>
38
39////////////////////////////////////////////////////////////////////////////////
40
41/// 检查传入参数是不是一个回文数
42///
43/// # 参数
44/// * `x` - 输入参数
45///
46/// # 举例
47/// ```
48/// use leetcode_rust::problems_cn::p000_0xx::p000_009::is_palindrome;
49///
50/// assert!(is_palindrome(12321) == true);
51/// assert!(is_palindrome(-12321) == false);
52/// ```
53pub fn is_palindrome(number: i32) -> bool {
54 // alg_1(number)
55 alg_2(number)
56}
57
58/// 算法 1: 使用双端队列.
59///
60/// # 参数
61/// * `number` - 待判定的数
62#[allow(dead_code)]
63fn alg_1(mut number: i32) -> bool {
64 if number < 0 {
65 return false;
66 }
67 let mut temp: Vec<i32> = vec![];
68
69 while number >= 10 {
70 temp.push(number % 10);
71 if number >= 10 {
72 number = number / 10;
73 }
74 }
75 temp.push(number);
76
77 if temp.len() == 2 {
78 return temp[0] == temp[1];
79 }
80
81 let mut idx_start = 0;
82 let mut idx_end = temp.len() - 1;
83
84 loop {
85 if idx_end == idx_start {
86 return true;
87 }
88
89 if idx_end - idx_start == 1 {
90 return temp[idx_end] == temp[idx_start];
91 }
92
93 if temp[idx_end] != temp[idx_start] {
94 return false;
95 }
96 idx_end -= 1;
97 idx_start += 1;
98 }
99}
100
101/// 算法 2: 按数位快速相减.
102///
103/// # 参数
104/// * `number` - 待判定的数
105#[allow(dead_code)]
106fn alg_2(mut number: i32) -> bool {
107 if number < 0 {
108 // 所有的负数都不是回文数
109 return false;
110 }
111
112 // Log10 得到的值是真实的数字位数 -1.
113 let mut digits = (number as f32).log10().floor() as usize;
114 if digits == 0 {
115 return true;
116 }
117
118 loop {
119 number = (number - (number % 10) * 10i32.pow(digits as u32)) / 10;
120 if number < 0 || digits <= 1 {
121 break;
122 }
123
124 digits -= 2;
125 }
126
127 number == 0
128}