Skip to content

Commit 25d5b43

Browse files
committed
Add: solution to LeetCode #9
1 parent fdbea7c commit 25d5b43

File tree

6 files changed

+169
-14
lines changed

6 files changed

+169
-14
lines changed

TODO.md

Lines changed: 0 additions & 9 deletions
This file was deleted.

src/problems.rs

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
//! # Solutions to LeetCode problems
2-
//!
3-
//! Note, the problems are quite similar to LeetCode China edition, but for
2+
//!
3+
//! Note, the problems are quite similar to LeetCode China edition, but for
44
//! certain problems, the requirements or orders are distinct.
5-
//!
5+
//!
66
77
////////////////////////////////////////////////////////////////////////////////
88

99
/// # Problems #000 - #099
10-
///
10+
///
1111
/// Solutions to problems #000 to #099 on LeetCode
1212
pub mod p000_0xx {
1313
/// Problem #5 *Longest Parlindrome Substring*
@@ -18,4 +18,6 @@ pub mod p000_0xx {
1818
pub mod p000_007;
1919
/// Problem #8 *String to Integer (atoi)*
2020
pub mod p000_008;
21-
}
21+
/// Problem #9 *Palindrome Number*
22+
pub mod p000_009;
23+
}

src/problems/p000_0xx/p000_009.rs

Lines changed: 126 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,126 @@
1+
//! # Description
2+
//!
3+
//! Given an integer `x`, return `true` if `x` is a
4+
//! palindrome, and `false` otherwise.
5+
//!
6+
//! Example 1:
7+
//!
8+
//! ```plain
9+
//! Input: x = 121
10+
//! Output: true
11+
//! Explanation: 121 reads as 121 from left to right and from right to left.
12+
//! ```
13+
//!
14+
//! Example 2:
15+
//!
16+
//! ```plain
17+
//! Input: x = -121
18+
//! Output: false
19+
//! Explanation: From left to right, it reads -121. From right to left, it becomes 121-. Therefore it is not a palindrome.
20+
//! ```
21+
//!
22+
//! Example 3:
23+
//!
24+
//! ```plain
25+
//! Input: x = 10
26+
//! Output: false
27+
//! Explanation: Reads 01 from right to left. Therefore it is not a palindrome.
28+
//! ```
29+
//!
30+
//! Constraints:
31+
//!
32+
//! $-2^{31} \leqslant x \leqslant 2^{31} - 1$
33+
//!
34+
//! Follow up: Could you solve it without converting the integer to a string?
35+
//!
36+
//! Source: <https://leetcode.com/problems/palindrome-number/>
37+
38+
////////////////////////////////////////////////////////////////////////////////
39+
40+
/// Check if a given input is a palindrome number
41+
///
42+
/// # Arguments
43+
/// * `x` - input number
44+
///
45+
/// # Examples
46+
/// ```
47+
/// use leetcode_rust::problems::p000_0xx::p000_009::is_palindrome;
48+
///
49+
/// assert!(is_palindrome(12321) == true);
50+
/// assert!(is_palindrome(-12321) == false);
51+
/// ```
52+
pub fn is_palindrome(number: i32) -> bool {
53+
// alg_1(number)
54+
alg_2(number)
55+
}
56+
57+
/// Algorithm 1: check digits using double-sided queue.
58+
///
59+
/// # Arguments
60+
/// * `number` - input number to check
61+
#[allow(dead_code)]
62+
fn alg_1(mut number: i32) -> bool {
63+
if number < 0 {
64+
return false;
65+
}
66+
let mut temp: Vec<i32> = vec![];
67+
68+
while number >= 10 {
69+
temp.push(number % 10);
70+
if number >= 10 {
71+
number = number / 10;
72+
}
73+
}
74+
temp.push(number);
75+
76+
if temp.len() == 2 {
77+
return temp[0] == temp[1];
78+
}
79+
80+
let mut idx_start = 0;
81+
let mut idx_end = temp.len() - 1;
82+
83+
loop {
84+
if idx_end == idx_start {
85+
return true;
86+
}
87+
88+
if idx_end - idx_start == 1 {
89+
return temp[idx_end] == temp[idx_start];
90+
}
91+
92+
if temp[idx_end] != temp[idx_start] {
93+
return false;
94+
}
95+
idx_end -= 1;
96+
idx_start += 1;
97+
}
98+
}
99+
100+
/// Algorithm 2: check digits fast subtraction.
101+
///
102+
/// # Arguments
103+
/// * `number` - input number to check
104+
#[allow(dead_code)]
105+
fn alg_2(mut number: i32) -> bool {
106+
if number < 0 {
107+
return false;
108+
}
109+
110+
// One digit shorter than actual length.
111+
let mut digits = (number as f32).log10().floor() as usize;
112+
if digits == 0 {
113+
return true;
114+
}
115+
116+
loop {
117+
number = (number - (number % 10) * 10i32.pow(digits as u32)) / 10;
118+
if number < 0 || digits <= 1 {
119+
break;
120+
}
121+
122+
digits -= 2;
123+
}
124+
125+
number == 0
126+
}

tests/cases/c000_0xx/c000_009.rs

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
use leetcode_rust::{
2+
common::{Case, CaseGroup},
3+
new_case,
4+
};
5+
6+
pub fn use_cases() -> Vec<Case<i32, bool, i32>> {
7+
let mut case_group: CaseGroup<i32, bool, i32> = CaseGroup::new();
8+
9+
// #1
10+
new_case!(case_group.create, 123, false);
11+
new_case!(case_group.create, 10, false);
12+
new_case!(case_group.create, 1230, false);
13+
new_case!(case_group.create, 123032, false);
14+
new_case!(case_group.create, 123321, true);
15+
// #6
16+
new_case!(case_group.create, -123321, false);
17+
new_case!(case_group.create, 1000030001, false);
18+
new_case!(case_group.create, 1, true);
19+
new_case!(case_group.create, 0, true);
20+
new_case!(case_group.create, 121, true);
21+
// #11
22+
new_case!(case_group.create, 213, false);
23+
24+
case_group.all()
25+
}

tests/cases/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,5 @@ pub mod c000_0xx {
33
pub mod c000_006;
44
pub mod c000_007;
55
pub mod c000_008;
6+
pub mod c000_009;
67
}

tests/problems/p000_0xx.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,12 @@ use crate::cases::c000_0xx::c000_005;
22
use crate::cases::c000_0xx::c000_006;
33
use crate::cases::c000_0xx::c000_007;
44
use crate::cases::c000_0xx::c000_008;
5+
use crate::cases::c000_0xx::c000_009;
56
use leetcode_rust::problems::p000_0xx::p000_005;
67
use leetcode_rust::problems::p000_0xx::p000_006;
78
use leetcode_rust::problems::p000_0xx::p000_007;
89
use leetcode_rust::problems::p000_0xx::p000_008;
10+
use leetcode_rust::problems::p000_0xx::p000_009;
911

1012
/// Test Problem 000_005: Longest Palindrome Substring
1113
#[test]
@@ -42,3 +44,11 @@ fn p000_008_convert_string_to_integer() {
4244
case.is_valid(p000_008::my_atoi((&case.input).to_string()));
4345
}
4446
}
47+
48+
/// Test Problem 000_009: Palindrome Number
49+
#[test]
50+
fn p000_009_is_palindrome_number() {
51+
for case in c000_009::use_cases() {
52+
case.is_valid(p000_009::is_palindrome(case.input));
53+
}
54+
}

0 commit comments

Comments
 (0)