时间复杂度:O(n)
解题思路
四步走策略。第一步忽略掉前导空格,第二步判断正负号,第三步字符串数字转换,第四步根据正负号返回结果。
第一步忽略前导空格就是只要遇到空格就略过。第二步就是在略过前导空格后判断第一个字符是否为“+”或者“-”。第三步就是正了八经的字符串数字转整数类型,需要注意的是,需要特判res是否超过int范围,如果超过就可以直接返回结果了。第四步是根据第二步的符号返回结果,默认为正数。
AC代码
func myAtoi(s string) int {
res:=0
minus:=false
i:=0
//忽略前导空格
for ;i<len(s);i++{
if s[i]!=' '{
break
}
}
//判断正负数
if i<len(s){
if s[i]=='-'{
minus=true
i++
}else if s[i]=='+'{
i++
}
}
//字符串整数转换
for ;i<len(s);i++{
//处理每个字符串数字,如果非数字就退出循环
if s[i]>='0'&&s[i]<='9'{
res=res*10+int(s[i]-'0')
//处理边界
if res>math.MaxInt32{
if minus==false{
return math.MaxInt32
}else{
return math.MinInt32
}
}
}else{
break
}
}
//如果是负数就返回相反数
if minus{
return -res
}
return res
}
感悟
判断是否超过int范围时,可以借助于math包的MaxInt32和MinInt32,不需要去搜索int范围十进制数是多少。