福田企业网站优化最好的方法,珠海网站建设 超凡科技,中国平安人寿保险公司官网,上海网站建设的价格题目描述
字符串转换整数 (atoi)
请你来实现一个 myAtoi(string s) 函数#xff0c;使其能将字符串转换成一个 32 位有符号整数#xff08;类似 C/C 中的 atoi 函数#xff09;。
函数 myAtoi(string s) 的算法如下#xff1a;
读入字符串并丢弃无用的前导空格检查下一…题目描述
字符串转换整数 (atoi)
请你来实现一个 myAtoi(string s) 函数使其能将字符串转换成一个 32 位有符号整数类似 C/C 中的 atoi 函数。
函数 myAtoi(string s) 的算法如下
读入字符串并丢弃无用的前导空格检查下一个字符假设还未到字符末尾为正还是负号读取该字符如果有。 确定最终结果是负数还是正数。 如果两者都不存在则假定结果为正。读入下一个字符直到到达下一个非数字字符或到达输入的结尾。字符串的其余部分将被忽略。将前面步骤读入的这些数字转换为整数即“123” - 123 “0032” - 32。如果没有读入数字则整数为 0 。必要时更改符号从步骤 2 开始。如果整数数超过 32 位有符号整数范围 [−2^31, 2^31 − 1] 需要截断这个整数使其保持在这个范围内。具体来说小于 −2^31 的整数应该被固定为 −2^31 大于 ^231 − 1 的整数应该被固定为 2^31 − 1 。返回整数作为最终结果。
注意
本题中的空白字符只包括空格字符 。除前导空格或数字后的其余字符串外请勿忽略 任何其他字符。
示例 1
输入s 42
输出42
解释加粗的字符串为已经读入的字符插入符号是当前读取的字符。
第 1 步42当前没有读入字符因为没有前导空格^
第 2 步42当前没有读入字符因为这里不存在 - 或者 ^
第 3 步42读入 42^
解析得到整数 42 。
由于 42 在范围 [-231, 231 - 1] 内最终结果为 42 。示例 2
输入s -42
输出-42
解释
第 1 步 -42读入前导空格但忽视掉^
第 2 步 -42读入 - 字符所以结果应该是负数^
第 3 步 -42读入 42^
解析得到整数 -42 。
由于 -42 在范围 [-2^31, 2^31 - 1] 内最终结果为 -42 。示例 3
输入s 4193 with words
输出4193
解释
第 1 步4193 with words当前没有读入字符因为没有前导空格^
第 2 步4193 with words当前没有读入字符因为这里不存在 - 或者 ^
第 3 步4193 with words读入 4193由于下一个字符不是一个数字所以读入停止^
解析得到整数 4193 。
由于 4193 在范围 [-2^31, 2^31 - 1] 内最终结果为 4193 。提示
0 s.length 200s 由英文字母大写和小写、数字0-9、 、、- 和 . 组成
解法
主要有两点一个是如何判断数字的各种边界一个是如何判断是否越界是否在范围 [-2^31, 2^31 - 1] 内。
判断是否越界可以使用数学方法可参考第7题LeetCode 7 整数反转
java代码
class Solution {public int myAtoi(String s) {// 符号默认为正int sign 1;// 是否有有效数字了即是否遇到了符号或数字因为符号后遇到非数字字符也结束boolean hasEle false;// 结果int res 0;// 遍历字符串for (int i 0; i s.length(); i) {// 确定第一个符号if (!hasEle) {if (s.charAt(i) 45) {sign -1;hasEle true;continue;} else if (s.charAt(i) 43) {hasEle true;continue;}// 前面的空格跳过if (s.charAt(i) 32) {continue;}}// 遇到非数字结束循环if (s.charAt(i) 48 || s.charAt(i) 57) {break;}// 遇到数字则加入计算if (s.charAt(i) 48 s.charAt(i) 57) {int digit Character.getNumericValue(s.charAt(i));// 检查是否越界:if (res Integer.MIN_VALUE / 10 || (res Integer.MIN_VALUE / 10 digit 8)) {return Integer.MIN_VALUE;}if (res Integer.MAX_VALUE / 10 || (res Integer.MAX_VALUE / 10 digit 7)) {return Integer.MAX_VALUE;}// 计算下一个结果注意符号的使用res res * 10 sign * digit;hasEle true;}}return res;}
}复杂度
时间复杂度O(n)n为字符串长度 空间复杂度O(1)