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