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}