0x01.问题
请你来实现一个 atoi
函数,使其能将字符串转换成整数。
首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止。接下来的转化规则如下:
- 如果第一个非空字符为正或者负号时,则将该符号与之后面尽可能多的连续数字字符组合起来,形成一个有符号整数。
- 假如第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成一个整数。
- 该字符串在有效的整数部分之后也可能会存在多余的字符,那么这些字符可以被忽略,它们对函数不应该造成影响。
注意: 假如该字符串中的第一个非空格字符不是一个有效整数字符、字符串为空或字符串仅包含空白字符时,则你的函数不需要进行转换,即无法进行有效转换。
在任何情况下,若函数不能进行有效的转换时,请返回 0 。
提示:
- 本题中的空白字符只包括空格字符
' '
。 - 假设我们的环境只能存储 32 位大小的有符号整数,那么其数值范围为 [−231, 231 − 1]。如果数值超过这个范围,请返回 INT_MAX (2^31 − 1) 或 INT_MIN (−2 ^31) 。
题目来源于Leetcode
Java函数形式: public int myAtoi(String str)
0x02.要点分析
读题,发现需求是将一个字符串转化成数字,并且有一些奇怪的规则,大致如下:
- 开头会有空白字符。
- 第一个非空白字符不是数字就返回0。
- 不存在有效转换就返回0。
- 有正负号来确定数字的正负
- 结尾可能是其它字符,也就是说,有效的数字位置应该是从去掉开头空白字符和正负号后开始的连续数字。
- 超过边界就返回边界。
那么我们可以根据这些规则来简单的模拟一下:
- 先去除字符串开头的空格。
- 如果去除后没有了,返回0。
- 然后判断第一个字符,用一个标志变量来标记正负,如果不是正负号,返回0。
- 读取数字,然后一位一位的转化成数字。
- 每次转换前都要判断一下,是否转换后会超出边界,如果会,返回最大或最小整型值。
0x03.模拟代码–Java
class Solution {
public int myAtoi(String str) {
char[] strs = str.toCharArray();
int n=strs.length;
int index=0,ans=0;
while(index<n&&strs[index]==' '){
index++;
}
if(index==n) return 0;
boolean flag=false;
if(strs[index]=='-'){
flag=true;
index++;
}else if(strs[index]=='+') index++;
else if(!Character.isDigit(strs[index])) return 0;
while(index<n&&Character.isDigit(strs[index])){
int d=strs[index]-'0';
if((Integer.MAX_VALUE-d)/10<ans){
return flag?Integer.MIN_VALUE:Integer.MAX_VALUE;
}
ans=ans*10+d;
index++;
}
return flag?-ans:ans;
}
}
注:此题使用状态机会比较简单,这里暂时省略。
Leetcode-4.3每日一题打卡完毕!
心情日记:复杂,繁琐,不是退却的理由。加油!!!
ATFWUS --Writing By 2020–04-03