字符串轉(zhuǎn)換整數(shù) (atoi)
請你來實(shí)現(xiàn)一個 myAtoi(string s) 函數(shù)举反,使其能將字符串轉(zhuǎn)換成一個 32 位有符號整數(shù)(類似 C/C++ 中的 atoi 函數(shù))。
函數(shù) myAtoi(string s) 的算法如下:
讀入字符串并丟棄無用的前導(dǎo)空格
檢查下一個字符(假設(shè)還未到字符末尾)為正還是負(fù)號,讀取該字符(如果有)军洼。 確定最終結(jié)果是負(fù)數(shù)還是正數(shù)锤窑。 如果兩者都不存在,則假定結(jié)果為正。
讀入下一個字符诚撵,直到到達(dá)下一個非數(shù)字字符或到達(dá)輸入的結(jié)尾缭裆。字符串的其余部分將被忽略。
將前面步驟讀入的這些數(shù)字轉(zhuǎn)換為整數(shù)(即寿烟,"123" -> 123澈驼, "0032" -> 32)。如果沒有讀入數(shù)字筛武,則整數(shù)為 0 缝其。必要時更改符號(從步驟 2 開始)。
如果整數(shù)數(shù)超過 32 位有符號整數(shù)范圍 [?231, 231 ? 1] 徘六,需要截?cái)噙@個整數(shù)内边,使其保持在這個范圍內(nèi)。具體來說待锈,小于 ?231 的整數(shù)應(yīng)該被固定為 ?231 漠其,大于 231 ? 1 的整數(shù)應(yīng)該被固定為 231 ? 1 。
返回整數(shù)作為最終結(jié)果竿音。
注意:
本題中的空白字符只包括空格字符 ' ' 和屎。
除前導(dǎo)空格或數(shù)字后的其余字符串外,請勿忽略 任何其他字符春瞬。
摘一個示例做個說明.
示例 1:
輸入:s = "42"
輸出:42
解釋:加粗的字符串為已經(jīng)讀入的字符柴信,插入符號是當(dāng)前讀取的字符。
第 1 步:"42"(當(dāng)前沒有讀入字符宽气,因?yàn)闆]有前導(dǎo)空格)
^
第 2 步:"42"(當(dāng)前沒有讀入字符随常,因?yàn)檫@里不存在 '-' 或者 '+')
^
第 3 步:"42"(讀入 "42")
^
解析得到整數(shù) 42 。
由于 "42" 在范圍 [-231, 231 - 1] 內(nèi)萄涯,最終結(jié)果為 42 绪氛。
提示:
0 <= s.length <= 200
s 由英文字母(大寫和小寫)、數(shù)字(0-9)窃判、' '钞楼、'+'、'-' 和 '.' 組成
條件分析:
- 丟棄無用前導(dǎo)空格 -> 前面會有無效空格
- 檢查除前導(dǎo)空格后的第一個字符是正號符號還是數(shù)字 -> 字符不一定有效
- 讀入下一個字符,直到到達(dá)下一個非數(shù)字字符或輸入的結(jié)尾 -> 讀入順序從前往后
解決思路1:
- 根據(jù)分析1,采用字符串分割,
- 根據(jù)分析2袄琳、3,循環(huán)判斷字符是否符合
采用字符串分割,然后判斷分割后的字符串是否有效.再判斷是否包含符號,再經(jīng)過循環(huán)判斷字符串,如果字符串是數(shù)組,或者字符串包含符號并且符號為+询件、-并且字符串為空字符串說明循環(huán)有效,否則結(jié)束.最后字符串進(jìn)行轉(zhuǎn)換,判斷字符串是否在范圍內(nèi)
func myAtoi(_ s: String) -> Int {
// 分割字符串
let array = s.split(separator: " ")
guard let string = array.first else {
return 0
}
var result: String = ""
// 是否有正負(fù)號
var hasSymbol = false
if string.hasPrefix("+") || string.hasPrefix("-"){
hasSymbol = true
}
// 循環(huán)判斷下一個字符
for item in string {
// 如果是數(shù)字,或者含有符號 并且是 +、-,而且這時候字符串還沒有值則有效
if item.isNumber || (hasSymbol && (item == "-" || item == "+") && result == "") {
result.append(item)
}else{
break
}
}
// 判斷值是否在范圍內(nèi)
let value: Double = Double(result) ?? 0
if value > Double(Int(powl(2, 31)) - 1) {
return Int(powl(2, 31)) - 1
}
if value < Double(Int(powl(-2, 31))) {
return Int(powl(-2, 31))
}
if Int(value) < Int(powl(-2, 31)) {
return Int(powl(-2, 31))
} else if Int(value) > Int(powl(2, 31)) - 1 {
return Int(powl(2, 31)) - 1
}
return Int(value)
}
測試用例:
無符號字符串 let str = "34589"
有符號字符串 let str = "-34589"
有符號字符串 let str = "+34589"
無符號字符串 let str = "lee34589"
有符號字符串 let str = "lee-34589"
有符號字符串 let str = "lee+34589"
有前導(dǎo)空格無符號字符串 let str = " 34589"
有前導(dǎo)空格有符號字符串 let str = " -34589"
有前導(dǎo)空格有符號字符串 let str = " +34589"
有前導(dǎo)空格無符號字符串 let str = " 3458sdf9"
有前導(dǎo)空格有符號字符串 let str = " -3458sdgf9"
有前導(dǎo)空格有符號字符串 let str = " +345yhuy89"
etc.
考察要點(diǎn):
- 字符串