为什么leetcode说我的atoi答案不正确?这是不正确的吗?还是leetcode中有错误

时间:2019-01-06 08:20:20

标签: algorithm go

我正在用leetcode解决atoi问题,我在下面提交了我的代码,这不太重要。我想知道leetcode是否给我带来了有效的失败。看来我的代码在做正确的事。

这是问题描述: enter image description here

leet code problem 这是代码:

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
}
  

任何帮助您理解此错误的人员将不胜感激。我不希望该算法有任何帮助。这是有效的错误吗?

2 个答案:

答案 0 :(得分:4)

在不检查算法的情况下,我会在错误消息中看到以下内容:

最大32位int值为2,147,483,647,当您得到一个比该值更大的字符串时(例如,您的输入为"2147483648",该值大一),预计将返回该值。您的程序显然返回了-2147483648

答案 1 :(得分:2)

“如果数值超出可表示的值范围INT_MAX或INT_MIN被重新调整”,则说明不明确。作者记住要返回符号匹配的值,但是并没有明确说明。

所以我想说,当您为大于INT_MAX的数字返回INT_MIN时,这可能被认为是正确的(尽管这有点不合逻辑)。