Skip to content

Commit a72c1b9

Browse files
committed
Add: CN 000_007
1 parent 21df666 commit a72c1b9

File tree

6 files changed

+176
-10
lines changed

6 files changed

+176
-10
lines changed

src/problems/p000_0xx/p000_007.rs

Lines changed: 39 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,38 @@
33
/// Exchange front and end digits (not bits) one by one, return zero if
44
/// overflow
55
///
6+
/// ### Description
7+
///
8+
/// Given a signed 32-bit integer x, return x with its digits reversed.
9+
/// If reversing x causes the value to go outside the signed 32-bit integer
10+
/// range [-231, 231 - 1], then return 0.
11+
///
12+
/// Assume the environment does not allow you to store 64-bit integers (signed or /// unsigned).
13+
///
14+
///
15+
///
16+
/// Example 1:
17+
///
18+
/// Input: x = 123
19+
/// Output: 321
20+
/// Example 2:
21+
///
22+
/// Input: x = -123
23+
/// Output: -321
24+
/// Example 3:
25+
///
26+
/// Input: x = 120
27+
/// Output: 21
28+
///
29+
///
30+
/// Constraints:
31+
///
32+
/// -231 <= x <= 231 - 1
33+
///
34+
/// Source: https://leetcode.com/problems/reverse-integer/description/
35+
///
636
/// ### Argument
7-
/// * `x` - 32-bit integer to alter
37+
/// * `x` - 32-bit signed integer to alter
838
///
939
/// ```
1040
/// use leetcode_rust::problems::p000_0xx::p000_007::reverse_integer;
@@ -20,20 +50,20 @@ pub fn reverse_integer(x: i32) -> i32 {
2050
/// Reverse an integer (32-bit long) and check for overflow.
2151
///
2252
/// ### Argument
23-
/// * `x` - 32-bit integer to alter
53+
/// * `x` - 32-bit signed integer to alter
2454
fn reverse_s1(x: i32) -> i32 {
2555
let mut temp_stack: Vec<u8> = vec![];
2656
// Convert integer to digits.
2757
for ch in x.to_string().as_bytes() {
28-
if *ch as char != '-' {
58+
if *ch != 45 {
2959
temp_stack.push(*ch);
3060
}
3161
}
3262
loop {
3363
// Remove trailing zeros if present
3464
match temp_stack.last() {
3565
Some(last_ch) => {
36-
if *last_ch as char == '0' && temp_stack.len() > 1 {
66+
if *last_ch == 48 && temp_stack.len() > 1 {
3767
temp_stack.pop();
3868
} else {
3969
break;
@@ -44,17 +74,18 @@ fn reverse_s1(x: i32) -> i32 {
4474
}
4575
temp_stack.reverse();
4676

47-
let mut overflow_at: i32 = 2147483647;
77+
// 2147483647 for positive numbers
78+
let mut overflow_at_u8: [u8; 10] = [50, 49, 52, 55, 52, 56, 51, 54, 52, 55];
4879
let mut target: Vec<u8> = vec![];
4980
// Detect sign of input number and update overflow threshold if needed.
5081
if x < 0 {
5182
target.push('-' as u8);
52-
overflow_at = 2147483647;
83+
84+
// 2147483648 for negative numbers (without sign)
85+
overflow_at_u8 = [50, 49, 52, 55, 52, 56, 51, 54, 52, 56];
5386
}
5487

5588
// Check overflow regardless of the sign
56-
let overflow_at_str = overflow_at.to_string();
57-
let overflow_at_u8 = overflow_at_str.as_bytes();
5889
if temp_stack.len() >= overflow_at_u8.len() {
5990
for idx in 0..overflow_at_u8.len() {
6091
if temp_stack[idx] < overflow_at_u8[idx] {

src/problems_cn.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
pub mod p000_0xx {
22
pub mod p000_005;
33
pub mod p000_006;
4+
pub mod p000_007;
45
}
Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
/// 32 位整型反转的同时检查溢出
2+
///
3+
/// ### 题目说明
4+
/// 给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。
5+
///
6+
/// 如果反转后整数超过 32 位的有符号整数的范围 [−231,  231 − 1] ,就返回 0。
7+
///
8+
/// 假设环境不允许存储 64 位整数(有符号或无符号)。
9+
///
10+
///
11+
/// 示例 1:
12+
///
13+
/// 输入:x = 123
14+
/// 输出:321
15+
/// 示例 2:
16+
///
17+
/// 输入:x = -123
18+
/// 输出:-321
19+
/// 示例 3:
20+
///
21+
/// 输入:x = 120
22+
/// 输出:21
23+
/// 示例 4:
24+
///
25+
/// 输入:x = 0
26+
/// 输出:0
27+
///
28+
///
29+
/// 提示:
30+
///
31+
/// -231 <= x <= 231 - 1
32+
///
33+
/// 来源:力扣(LeetCode)
34+
/// 链接:https://leetcode.cn/problems/reverse-integer
35+
/// 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
36+
///
37+
/// ### Argument
38+
/// * `x` - 32 位有符号整数
39+
///
40+
/// ```
41+
/// use leetcode_rust::problems_cn::p000_0xx::p000_007::reverse_integer;
42+
/// assert_eq!(reverse_integer(-2147483647), 0);
43+
/// assert_eq!(reverse_integer(123), 321);
44+
/// assert_eq!(reverse_integer(120), 21);
45+
/// assert_eq!(reverse_integer(-123), -321);
46+
/// ```
47+
pub fn reverse_integer(x: i32) -> i32 {
48+
reverse_s1(x)
49+
}
50+
51+
/// 32 位整型反转的同时检查溢出
52+
///
53+
/// ### Argument
54+
/// * `x` - 32 位有符号整数
55+
fn reverse_s1(x: i32) -> i32 {
56+
let mut temp_stack: Vec<u8> = vec![];
57+
// 将无符号数转换为数字数组
58+
for ch in x.to_string().as_bytes() {
59+
if *ch != 45 {
60+
temp_stack.push(*ch);
61+
}
62+
}
63+
loop {
64+
// 去除结尾的数字 0
65+
match temp_stack.last() {
66+
Some(last_ch) => {
67+
if *last_ch == 48 && temp_stack.len() > 1 {
68+
temp_stack.pop();
69+
} else {
70+
break;
71+
}
72+
}
73+
None => break,
74+
}
75+
}
76+
temp_stack.reverse();
77+
78+
// 正数的溢出阈值为 2147483647(包含符号)
79+
let mut overflow_at_u8: [u8; 10] = [50, 49, 52, 55, 52, 56, 51, 54, 52, 55];
80+
let mut target: Vec<u8> = vec![];
81+
// 检测输入值的符号并据此更新判断溢出的阈值
82+
if x < 0 {
83+
target.push('-' as u8);
84+
85+
// 负数的溢出阈值为 2147483648(不包含符号)
86+
overflow_at_u8 = [50, 49, 52, 55, 52, 56, 51, 54, 52, 56];
87+
}
88+
89+
// 在无符号的状态下检查溢出
90+
if temp_stack.len() >= overflow_at_u8.len() {
91+
for idx in 0..overflow_at_u8.len() {
92+
if temp_stack[idx] < overflow_at_u8[idx] {
93+
// 如果某一位数值比溢出值要小,则没有必要检查后续的各位数值
94+
break;
95+
}
96+
if temp_stack[idx] > overflow_at_u8[idx] {
97+
// 上一个数值(如果存在)位置的目标值和阈值相同,
98+
// 如果当前位的目标值大于阈值则表示溢出
99+
return 0;
100+
}
101+
}
102+
}
103+
// 结合符号和数字
104+
target = [target, temp_stack].concat();
105+
String::from_utf8(target).unwrap().parse::<i32>().unwrap()
106+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
use leetcode_rust::common::Case;
2+
3+
pub fn use_cases() -> Vec<Case<i32, i32>> {
4+
let mut cases: Vec<Case<i32, i32>> = vec![];
5+
cases.push(Case::new(-2147483648, vec![0]));
6+
cases.push(Case::new(2147483647, vec![0]));
7+
cases.push(Case::new(0, vec![0]));
8+
cases.push(Case::new(123, vec![321]));
9+
cases.push(Case::new(-123, vec![-321]));
10+
cases.push(Case::new(120, vec![21]));
11+
cases.push(Case::new(900800, vec![8009]));
12+
cases.push(Case::new(2147457412, vec![0]));
13+
cases.push(Case::new(-2147483412, vec![-2143847412]));
14+
15+
cases
16+
}

tests/cases_cn/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
pub mod c000_0xx {
22
pub mod c000_005;
33
pub mod c000_006;
4+
pub mod c000_007;
45
}

tests/problems_cn/p000_0xx.rs

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,19 @@
11
use super::super::cases_cn::c000_0xx::c000_005;
22
use super::super::cases_cn::c000_0xx::c000_006;
3+
use super::super::cases_cn::c000_0xx::c000_007;
34
use leetcode_rust::problems_cn::p000_0xx::p000_005;
45
use leetcode_rust::problems_cn::p000_0xx::p000_006;
6+
use leetcode_rust::problems_cn::p000_0xx::p000_007;
57

6-
/// Test Problem 000_005: 最长回文子串
8+
/// 题目 000_005: 最长回文子串
79
#[test]
810
fn p000_005_longest_palindrome() {
911
for case in c000_005::use_cases() {
1012
case.is_valid(p000_005::longest_palindrome((&case.input).to_string()));
1113
}
1214
}
1315

14-
/// Test Problem 000_006: Z 字形变换
16+
/// 题目 000_006: Z 字形变换
1517
#[test]
1618
fn p000_006_zigzag_conversion() {
1719
for case in c000_006::use_cases() {
@@ -22,3 +24,12 @@ fn p000_006_zigzag_conversion() {
2224
));
2325
}
2426
}
27+
28+
/// 题目 000_007: 整数反转
29+
#[test]
30+
fn p000_007_reverse_integer() {
31+
for case in c000_007::use_cases() {
32+
case.is_valid(p000_007::reverse_integer(case.input));
33+
}
34+
}
35+

0 commit comments

Comments
 (0)