Offer 驾到,掘友接招!我正在参与2022春招系列活动-刷题打卡任务,点击查看活动详情
描述
写一个函数 StrToInt,实现把字符串转换成整数这个功能。不能使用 atoi 或者其他类似的库函数。传入的字符串可能有以下部分组成:
-
若干空格
-
(可选)一个符号字符('+' 或 '-')
-
数字,字母,符号,空格组成的字符串表达式
-
若干空格
转换算法如下:
1.去掉无用的前导空格
2.第一个非空字符为+或者-号时,作为该整数的正负号,如果没有符号,默认为正数
3.判断整数的有效部分:
3.1 确定符号位之后,与之后面尽可能多的连续数字组合起来成为有效整数数字,如果没有有效的整数部分,那么直接返回0
3.2 将字符串前面的整数部分取出,后面可能会存在存在多余的字符(字母,符号,空格等),这些字符可以被忽略,它们对于函数不应该造成影响
**3.3 整数超过 32 位有符号整数范围 [−2^31 , 2^(31− 1)] ,需要截断这个整数,使其保持在这个范围内。具体来说,小于 −2^31的整数应该被调整为 −2^31 ,大于 2^(31− 1) 的整数应该被调整为 2^(31− 1)
4.去掉无用的后导空格
示例1
输入:
"82"
返回值:
82
示例2
输入:
" -12 "
返回值:
-12
说明:
去掉前后的空格,为-12
思路
我们只需要先将前后多余的空格除去,然后按照字节读取,判断是否在0-9之间即可!
AC Code
func StrToInt( s string ) int {
(1) s = strings.Trim(s," ")
if len(s)==0{
return 0
}
sign := 1
(2) if s[0]=='-'{
sign=-1
s = s[1:]
(3) }else if s[0]=='+'{
s = s[1:]
}
s1 := []byte(s)
res := 0
for _, v := range s1{
(4) if v >= '0' && v <= '9' {
(5) res = res*10+int(v-'0')*sign
if sign == 1 && res>math.MaxInt32{
(6) return math.MaxInt32
}
if sign == -1 && res < -math.MaxInt32{
(7) return -math.MaxInt32-1
}
} else {
break
}
}
return res
}
- (1) 删除前后多余的空格
- (2) 如果第一位是-那么就做个标志,标志符号位为-1,再删去这个元素
- (3) 如果第一位是+,那么就直接删去
- (4) 如果这个v是在0到9之间的话
- (5) 结果就等于不断递增的res加上这个值
- (6) 如果超过了最大值,就直接return最大的int32的值
- (7) 否则就返回-的int32