LeetCode Rust - 8 - 字符串转换整数 (atoi)

原题:8. 字符串转换整数 (atoi) - 力扣(LeetCode)

解一,遍历模拟

  • 遍历字符,直到遇见符号或数字,如果遇到非符号和字符串,返回零
  • 如果找不到符号或者数字,返回零
  • 判断是否为符号,如果是,记录符号 sign,指针前进一步,如果进步后越界,则返回零
  • 循环遍历剩余字符直到不是数字,对每个数字字符 char 和结果 res
    • res *= 10
    • res += char - 48

      这里使用 rust 内置的标准函数,保证整形不会溢出 res 以有符号 64 位存储

  • 根据 sign 判断是否溢出,溢出返回其最大/最小值,否则返回其本身
pub fn my_atoi(s: String) -> i32 {
	fn is_number(char: u8) -> bool {
		char >= b'0' && char <= b'9'
	}
	fn is_sign(char: u8) -> bool {
		char == b'+' || char == b'-'
	}

	let mut i = 0usize;
	let len = s.len();
	let mut res = 0i64;
	let bytes = s.as_bytes();

	while i < len {
		if bytes[i] == b' ' {
			i += 1;
		} else if is_number(bytes[i]) || is_sign(bytes[i]) {
			break;
		} else {
			return res as i32;
		}
	}
	if i >= len {
		return res as i32;
	};

	let mut sign = '+';
	if is_sign(bytes[i]) {
		if i + 1 >= len {
			return res as i32;
		} else {
			sign = bytes[i] as char;
			i += 1
		}
	}

	while i < len && is_number(bytes[i]) {
		res = res.saturating_mul(10);
		res = res.saturating_add((bytes[i] - 48u8) as i64);
		i += 1;
	}
	
	return if sign == '+' {
		(i32::MAX as i64).min(res) as i32
	} else {
		res = res.saturating_mul(-1);
		(i32::MIN as i64).max(res) as i32
	};
}

反向链接


图谱

LeetCodeObsidian我的作品技术蓝色协议(日服)FLCL无职转生~到异世界就拿出真本事~混沌武士2023-06-062023-06-102023-06-132023-07-02Antd NoteBookCPU性能天梯图CSS NoteBookGFWIndexedDB 读写地狱JS 事件循环JS 原型链JS 运算符LaTeX NoteBookLeetCode Rust - 1 - 两数之和LeetCode Rust - 122 - 买卖股票的最佳时机 IILeetCode Rust - 125 - 验证回文串LeetCode Rust - 136 - 只出现一次的数字LeetCode Rust - 189 - 轮转数组LeetCode Rust - 217 - 存在重复元素LeetCode Rust - 242 - 有效的字母异位词LeetCode Rust - 26 - 删除有序数组中的重复项LeetCode Rust - 283 - 移动零LeetCode Rust - 344 - 反转字符串LeetCode Rust - 350 - 两个数组的交集 IILeetCode Rust - 36 - 有效的数独LeetCode Rust - 387 - 字符串中的第一个唯一字符LeetCode Rust - 48 - 旋转图像LeetCode Rust - 66 - 加一LeetCode Rust - 7 - 整数反转LeetCode Rust - 8 - 字符串转换整数 (atoi)Rust NoteBookYAMLcargo 配置hugo-obsidian 元数据解析问题safari 移动端适配发布同步国际邮箱安装 mingw显卡性能天梯图注册日本邮箱科学上网第三方插件配置 Ruby 环境🤖Gmail🤖Netch🤖Obsidian Git🤖Outlook🤖Plugin Proxy🤖epub.js🤖pdf.js🤖yuè - Web 阅读器🤖加速器HomeReact18 diff 算法Vue3 diff 算法Vue3 响应式系统Vue3 渲染流程CssMarkdownReactRustViteVueWebpack下载万代南梦宫启动器下载蓝色协议注册万代南梦宫账号🤖setup CliLeetcode originLeetcode time&space