题目链接
题目描述
题解
题解一(Go)
忘了有限自动机是啥了,只能按JDK的Integer.parseInt()写了
func myAtoi(s string) int {
/*
不就是手写一个Integer.parseInt()吗,有手就行
*/
if len(s) <= 0 {
return 0
}
len := len(s)
// 忽略前导空格
index := 0
for index < len && s[index] == ' ' {
index++
}
// 除了空格啥也没有
if index == len {
return 0
}
// 最大的值
maxInt := -((1 << 31) - 1)
// 判断是不是负数
isPositive := false
// 辨别符号位
// ASCII码表中+和-都比0小
if s[index] < '0' {
if s[index] == '-' {
isPositive = true
maxInt = -1 << 31
} else if s[index] != '+' {
return 0
}
// 如果除了符号位已经没有别的东西了,直接返回
if index == len-1 {
return 0
}
index++
}
// sum:用于计数,计算当前数字
// minMult:num能支持的最大进位的数字,再进一位就会越界
sum, minMult := 0, maxInt/10
// 从index开始遍历字符串
for index < len {
// 判断是否是数字
if num := isNum(s[index]); num == -1 {
// 不是数字直接返回
break
} else {
// 如果进一位就会越界,直接返回最大值
if sum < minMult {
sum = maxInt
break
}
// 进位
sum *= 10
// 如果进位之后加num会越界,那么直接返回最大值
if sum < maxInt+num {
sum = maxInt
break
}
// 不越界,加上当前数字
sum -= num
}
index++
}
// 如果是正数返回正数,如果是负数返回负数
if isPositive {
return sum
} else {
return -sum
}
}
// 判断是否是数字
func isNum(num uint8) int {
if num >= '0' && num <= '9' {
return int(num - '0')
} else {
return -1
}
}