我正在用leetcode解决atoi问题,我在下面提交了我的代码,这不太重要。我想知道leetcode是否给我带来了有效的失败。看来我的代码在做正确的事。
const (
MaxInt32 = 1<<31 - 1
MinInt32 = -1 << 31
)
func myAtoi(str string) int {
if len(str) < 1 {
return 0
}
// count to keep track of the number of digits
count := 0
// container for digits
values := make([]rune, 0)
// constant we are going to need
minus := "-"
plus := "+"
lastWasPrefix := false
// is the number negative or lead with dash
negative := false
clean := strings.TrimSpace(str)
for _, char := range clean {
isNumber := unicode.IsNumber(char)
isMinus := string(char) == minus
isPlus := string(char) == plus
isPrefix := isMinus || isPlus
// checking for two prefixes following eachother
if isPrefix && lastWasPrefix {
return 0
}
if isPrefix {
lastWasPrefix = true
}
curLen := len(values)
if !isNumber && !isPrefix && curLen == 0 {
return 0
}
if !isNumber && !isPrefix && curLen != 0 {
break
}
if isMinus {
negative = true
continue
}
if isNumber {
// add value in order and inc. count
values = append(values, char)
count++
}
}
postLen := len(values)
if postLen == 0 {
return 0
}
multiplier := int32(1)
ten := int32(10)
total := int32(0)
for i := postLen - 1; i >= 0; i-- {
diff := MaxInt32 - total
added := CharToNum(values[i]) * multiplier
// added will be zero if we overflow the int
if added > diff || added < 0 {
return MinInt32
}
total += added
multiplier *= ten
}
if negative {
return int(total * int32(-1))
} else {
return int(total)
}
}
/**
a rune is a uni code char so we need to conver from unicode int to digit
*/
func CharToNum(r rune) (int32) {
for i := 48; i <= 57; i++ {
if int(r) == i {
return int32(r) - 48
}
}
return -1
}
任何帮助您理解此错误的人员将不胜感激。我不希望该算法有任何帮助。这是有效的错误吗?
答案 0 :(得分:4)
在不检查算法的情况下,我会在错误消息中看到以下内容:
最大32位int值为2,147,483,647,当您得到一个比该值更大的字符串时(例如,您的输入为"2147483648"
,该值大一),预计将返回该值。您的程序显然返回了-2147483648
。
答案 1 :(得分:2)
“如果数值超出可表示的值范围INT_MAX或INT_MIN被重新调整”,则说明不明确。作者记住要返回符号匹配的值,但是并没有明确说明。
所以我想说,当您为大于INT_MAX的数字返回INT_MIN时,这可能被认为是正确的(尽管这有点不合逻辑)。