题目链接:https://leetcode.cn/problems/string-to-integer-atoi/
思路
-
读入字符串并丢弃无用的前导空格
隐藏条件:在读取到第一个符号位或数字位前面只能出现空格否则无法转换。
我们取一个标识变量f记录前导空格,一直读取到第一个符号位或者是数字位,f才为1。 -
检查下一个字符(假设还未到字符末尾)为正还是负号,读取该字符(如果有)。 确定最终结果是负数还是正数。 如果两者都不存在,则假定结果为正。
我们取一个符号位变量flag,来记录最后答案的正负。 -
读入下一个字符,直到到达下一个非数字字符或到达输入的结尾。字符串的其余部分将被忽略。
这个很简单,因为前面我们取了一个标志位f了,当标志位f为1的情况下,读取到的不是数字,则跳出循环。 -
将前面步骤读入的这些数字转换为整数(即,“123” -> 123, “0032” -> 32)。如果没有读入数字,则整数为 0 。必要时更改符号(从步骤 2 开始)。
我们可以把符号位和数字分开来,用ans来记录数字,每次读到一位数字将ans * 10,把当前读取到的数字转为int型,与ans相加(不理解的童鞋可以打一下草稿,写一下每次的过程)。 -
如果整数数超过 32 位有符号整数范围 [−231, 231 − 1] ,需要截断这个整数,使其保持在这个范围内。具体来说,小于 −231 的整数应该被固定为 −231 ,大于 231 − 1 的整数应该被固定为 231 − 1 。
- 符号位flag为-1的时候,判断是否ans > 231
- 是,则返回−231
- 否,则返回ans * flag
- 符号位flag为1的时候,判断是否ans > 231 - 1
- 是,则返回231 - 1
- 否,则返回ans * flag
- 隐藏条件: 如果在循环读取数字的时候,ans > 231就可以跳出循环了。
代码实现
func myAtoi(s string) int {
//ans答案 flag符号位 f表示一直读到符号或者是数字才为1
ans,flag, f := 0, 1, 0
for i := range s{
//读取数字
if s[i] >= '0' && s[i] <= '9'{
ans = ans * 10 + int(s[i] - '0')
f = 1
if ans > 1<<31{
break
}
}else if s[i] == '-' && f == 0{
flag = -1
f = 1
}else if s[i] == '+' && f == 0{
f = 1
}else if f == 1 || (f == 0 && s[i] != ' '){
break
}
}
if f == 1{
if flag == -1 && ans > 1<<31{
return -1 * (1<<31)
}else if flag == 1 && ans > (1<<31) - 1{
return (1<<31) - 1
}
return ans * flag
}
return 0
}