题目
思考
该问题想表达的是在字符串中,寻找数字(可能是负数),就那些组装,返回整数
我们可以提取 正负数符号 和 满足需求的 数字
由此产生了2个问题
- 如何提取正确的表达式
- 对已经提取了的表达式如何计算其值
如何提取正确的表达式
正确的表达式应当由: 空格' ' / 负号- / 加号+ / 以及 数字构成,其余的,都不应该算作正确的表达式,且空格仅仅有前置
举个栗子
'abc+123' :
是不存在正确的表达式,因为是前置是非 空格' ' / 负号- / 加号+ / 以及 数字构成
' -123 456'
正确的表达式应该是 -123 , 因为前置空格可以忽略,后置遇到空格直接退出即可
对于如下字符串
根据上诉例子,我们可以编写如下伪代码
for 字符 range 字符数组 if 字符 == 空格 没有记录过任何表达式 continue else 退出 if 字符 == 负号 if 表达式已经被标记过符号 退出 标记整个字符串为负数 负号标记 if 字符 == 加号 if 表达式已经被标记过符号 退出 标记整个字符串为负数 加号标记 if 字符 满足 1 - 9 记录数字 输出 记录的数字 和 符号
编写提取表达式代码
func myAtoi(str string) { expression := make([]byte,0) negative := false symbol := false fuckoj := false for i:=0;i<len(str);i++ { if ' ' == str[i] { if 0 != len(expression) || fuckoj { break } else if negative { break } else if symbol || fuckoj { break } continue } else if '-' == str[i] { if 0 != len(expression) || fuckoj { break } else { if symbol || fuckoj { break } symbol = true negative = true } } else if '+' == str[i] { if 0 != len(expression) || fuckoj { break } else { if symbol { break } symbol = true continue } } else if str[i] >= 48 && str[i] <= 57 { if 48 == str[i] { fuckoj = true if 0 == len(expression) { continue } } expression = append(expression, str[i]) } else { break } } fmt.Print(str," ") if 0 == len(expression) { fmt.Print("没有表达式") } if negative { fmt.Print("符号为- ") } else { fmt.Print("符号为+ ") } fmt.Println("表达式为: " , string(expression)) }
我们带入上诉字符串,得到结果
abc+-123 789 没有表达式符号为+ 表达式为: -123 789 符号为- 表达式为: 123 -123 789 符号为- 表达式为: 123
对已经提取了的表达式如何计算其值
该问题可以理解为这样
123 = 3 * 1 + 2 * 10 + 1 * 100
类似于这样
再根据其正数 和 负数 符号来判断是 正数 还是 负数
指的注意的是
题目中关于整数取值范围
提交代码
func myAtoi(str string) int { expression := make([]byte,0) negative := false result := make([]int,0) symbol := false fuckoj := false for i:=0;i<len(str);i++ { if ' ' == str[i] { if 0 != len(expression) || fuckoj { break } else if negative { break } else if symbol || fuckoj { break } continue } else if '-' == str[i] { if 0 != len(expression) || fuckoj { break } else { if symbol || fuckoj { break } symbol = true negative = true } } else if '+' == str[i] { if 0 != len(expression) || fuckoj { break } else { if symbol { break } symbol = true continue } } else if str[i] >= 48 && str[i] <= 57 { if 48 == str[i] { fuckoj = true if 0 == len(expression) { continue } } expression = append(expression, str[i]) } else { break } } if 0 == len(expression) { return 0 } for k:=0;k<len(expression);k++ { result = append(result, int(expression[k]) - 48) } if 10 < len(result) { if negative { return -2147483648 } else { return 2147483647 } } jinzhi := 1 sum := 0 for j:=len(result)-1;j>=0;j-- { if sum >= 2147483648 { if negative { return -2147483648 } else { return 2147483647 } } sum = sum + result[j] * jinzhi jinzhi = jinzhi * 10 } if negative { sum = sum * -1 } if sum >= 2147483647 { sum = 2147483647 } if sum <= -2147483648 { sum = -2147483648 } return sum }