力扣 8. 字符串转换整数 (atoi) 解题
Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
题目
思考
该问题想表达的是在字符串中,寻找数字(可能是负数),就那些组装,返回整数
我们可以提取 正负数符号 和 满足需求的 数字
由此产生了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
}
欢迎转发!
请保留源地址: https://www.cnblogs.com/NoneID

浙公网安备 33010602011771号