ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Kimi LeetCode 8.字符串转换整数(atoi) Rust实现

Kimi    LeetCode 8.字符串转换整数(atoi) Rust实现 以下是 LeetCode 8. 字符串转换整数 (atoi) 的 Rust 实现rustimpl Solution {pub fn my_atoi(s: String) - i32 {let bytes s.as_bytes();let n bytes.len();let mut i 0;// 1. 跳过前导空格while i n bytes[i] b {i 1;}if i n {return 0;}// 2. 确定符号let mut sign 1;if bytes[i] b- {sign -1;i 1;} else if bytes[i] b {i 1;}// 3. 转换数字同时检查溢出let mut result: i32 0;let threshold i32::MAX / 10; // 214748364while i n bytes[i].is_ascii_digit() {let digit (bytes[i] - b0) as i32;// 溢出检查乘法前先判断// 正数溢出阈值2147483647最后一位最大为 7// 负数溢出阈值-2147483648最后一位最大为 8// 由于统一用正数判断所以阈值用 7因为 i32::MAX 最后一位是 7if result threshold || (result threshold digit 7) {return if sign 1 { i32::MAX } else { i32::MIN };}result result * 10 digit;i 1;}sign * result}}关键点说明步骤 说明跳过空格 使用 while 循环跳过前导空格字符 符号判断 检查 - 或 默认为正数数字转换 将 u8 字符转换为数字bytes[i] - b0溢出防护 在乘法之前检查result i32::MAX/10 或等于时判断末位溢出判断逻辑- i32::MAX 2147483647i32::MAX / 10 214748364- 当 result 214748364 时乘以 10 必然溢出- 当 result 214748364 时下一位数字不能超过 7因为 i32::MAX 最后一位是 7- 对于负数-2147483648 最后一位是 8但由于我们在正数阶段做判断用 7 作为阈值是安全的因为 8 7 也会被截断到 i32::MIN复杂度- 时间复杂度: O(n)最多遍历字符串一次- 空间复杂度: O(1)只使用常数个变量
返回列表