今天在家,做了一會(huì) leetcode 上的題目,這次的題目不難,是關(guān)于 “字符串轉(zhuǎn)換整數(shù)” 的??偟膩?lái)說(shuō),需要注意處理好邊際條件,就可以順利解答了。
請(qǐng)你來(lái)實(shí)現(xiàn)一個(gè) atoi 函數(shù),使其能將字符串轉(zhuǎn)換成整數(shù)。
首先,該函數(shù)會(huì)根據(jù)需要丟棄無(wú)用的開頭空格字符,直到尋找到第一個(gè)非空格的字符為止。接下來(lái)的轉(zhuǎn)化規(guī)則如下:
如果第一個(gè)非空字符為正或者負(fù)號(hào)時(shí),則將該符號(hào)與之后面盡可能多的連續(xù)數(shù)字字符組合起來(lái),形成一個(gè)有符號(hào)整數(shù)。
假如第一個(gè)非空字符是數(shù)字,則直接將其與之后連續(xù)的數(shù)字字符組合起來(lái),形成一個(gè)整數(shù)。
該字符串在有效的整數(shù)部分之后也可能會(huì)存在多余的字符,那么這些字符可以被忽略,它們對(duì)函數(shù)不應(yīng)該造成影響。
假如該字符串中的第一個(gè)非空格字符不是一個(gè)有效整數(shù)字符、字符串為空或字符串僅包含空白字符時(shí),則你的函數(shù)不需要進(jìn)行轉(zhuǎn)換,即無(wú)法進(jìn)行有效轉(zhuǎn)換。
在任何情況下,若函數(shù)不能進(jìn)行有效的轉(zhuǎn)換時(shí),請(qǐng)返回 0 。
注意:
本題中的空白字符只包括空格字符 ' ' 。
假設(shè)我們的環(huán)境只能存儲(chǔ) 32 位大小的有符號(hào)整數(shù),那么其數(shù)值范圍為 [?231, 231 ? 1]。如果數(shù)值超過(guò)這個(gè)范圍,請(qǐng)返回 231 ? 1 或 ?231 。
以下是 Go 語(yǔ)言實(shí)現(xiàn)寫的答案:
func myAtoi(s string) int {
var res int64
sign, letter, number := false, false, false
var flag int64 = 1
for _, v := range s {
if v == ' ' {
if sign || letter || number {
break
}
} else if v == '-' || v == '+' {
if sign || letter || number {
break
}
sign = true
if v == '-' {
flag = -1
}
} else if v >= '0' && v <= '9' && !letter {
number = true
res = res*10 + (int64(v) - int64('0'))
} else {
letter = true
}
if res*flag < math.MinInt32 {
return math.MinInt32
}
if res*flag > math.MaxInt32 {
return math.MaxInt32
}
}
return int(res * flag)
}