在要求输入数字处找到非数字字符_剑指 Offer 67. 把字符串转换成整数 leetcode 剑指offer系列...
題目難度: 中等
原題鏈接[1]
今天繼續更新劍指 offer 系列, 老樣子晚上 6 點 45 分準時更新公眾號 每日精選算法題, 大家記得關注哦~ 另外在公眾號里回復 offer 就能看到劍指 offer 系列當前連載的所有文章了
題目描述
寫一個函數 StrToInt,實現把字符串轉換成整數這個功能。不能使用 atoi 或者其他類似的庫函數。
首先,該函數會根據需要丟棄無用的開頭空格字符,直到尋找到第一個非空格的字符為止。
當我們尋找到的第一個非空字符為正或者負號時,則將該符號與之后面盡可能多的連續數字組合起來,作為該整數的正負號;假如第一個非空字符是數字,則直接將其與之后連續的數字字符組合起來,形成整數。
該字符串除了有效的整數部分之后也可能會存在多余的字符,這些字符可以被忽略,它們對于函數不應該造成影響。
注意:假如該字符串中的第一個非空格字符不是一個有效整數字符、字符串為空或字符串僅包含空白字符時,則你的函數不需要進行轉換。
在任何情況下,若函數不能進行有效的轉換時,請返回 0。
說明:
假設我們的環境只能存儲 32 位大小的有符號整數,那么其數值范圍為 ?[?2^31, ?2^31 ? 1]。如果數值超過這個范圍,請返回 ?INT_MAX (2^31 ? 1) 或 ?INT_MIN (?2^31) 。
題目樣例
示例
- 示例 ?1:
- 輸入: "42"
- 輸出: 42
- 示例 ?2:
- 輸入: " -42"
- 輸出: -42
- 解釋: 第一個非空白字符為 '-', 它是一個負號。? - 我們盡可能將負號與后面所有連續出現的數字組合起來,最后得到 -42 。
- 示例 ?3:
- 輸入: "4193 with words"
- 輸出: 4193
- 解釋: 轉換截止于數字 '3' ,因為它的下一個字符不為數字。
- 示例 ?4:
- 輸入: "words and 987"
- 輸出: 0
- 解釋: 第一個非空字符是 'w', 但它不是數字或正、負號。
- 因此無法執行有效的轉換。
- 示例 ?5:
- 輸入: "-91283472332"
- 輸出: -2147483648
- 解釋: 數字 "-91283472332" 超過 32 位有符號整數范圍。? - 因此返回 INT_MIN (?231) 。
題目思考
解決方案
思路
- 首先考慮需要處理哪些字符, 顯然有空白字符/數字/正負號/其他字符四種情況:
空白字符
- 開頭連續的空白字符是有效情況; 但遇到非空白字符之后的空白字符就是無效的了, 需要直接終止遍歷
- 所以需要維護一個 isHeadBlank 變量來標記當前是否是開頭連續空白字符
數字
- 字符串從左到右遍歷, 所以需要將最終結果乘以 10 后再加上當前數字轉成的 int
- 數字總是有效的, 但需要注意將 isHeadBlank 置為 false
正負號
- 正負號只有是第一個非空白字符時才有效, 其他情況均無效
- 所以可以同樣利用 isHeadBlank 變量: 遇到正負號時, 只有當 isHeadBlank 是 true 的時候才說明它是第一個非空白字符; 否則它前面一定有其他非空白字符(數字或者正負號)了, 當前正負號就無效了
- 還需要維護一個 pos 變量來標記當前符號, 若當前是有效的負號, 需要將 pos 置為 false
- 同樣的, 處理好正負號后需要將 isHeadBlank 置為 false
其他字符
- 任何情況下遇到其他字符都要終止遍歷
- 根據上述步驟遍歷完字符串后, 我們得到了一個整數, 需要根據 pos 符號來決定是否取相反數, 另外還要根據題目中要求的上下限范圍來調整最終結果
- 下面的代碼對必要步驟有詳細的解釋, 方便大家理解
復雜度
- 時間復雜度 O(N): 最多只需要遍歷每個字符一次
- 空間復雜度 O(1): 只使用了幾個變量
代碼
class?Solution:????def?strToInt(self,?str:?str)?->?int:
????????#?使用兩個flag,?記錄符號pos以及是否是開頭空白字符isHeadBlank
????????#?正負號的時候同樣利用isHeadBlank,?只有是true才有效
????????#?注意符號和取值范圍
????????res?=?0
????????pos?=?True
????????isHeadBlank?=?True
????????for?c?in?str:
????????????if?c?==?'?':
????????????????if?not?isHeadBlank:
????????????????????#?非開頭空格字符,?之后的字符串無效,?直接退出遍歷
????????????????????break
????????????elif?'0'?<=?c?<=?'9':
????????????????isHeadBlank?=?False
????????????????#?更新結果數字
????????????????res?=?10?*?res?+?int(c)
????????????elif?c?==?'+'?or?c?==?'-':
????????????????if?isHeadBlank:
????????????????????isHeadBlank?=?False
????????????????????if?c?==?'-':
????????????????????????#?pos置為false,?表示結果需要取相反數
????????????????????????pos?=?False
????????????????else:
????????????????????#?正負號不是第一個非空字符,?無效!?退出遍歷
????????????????????break
????????????else:
????????????????#?其他字符,?一律無效,?退出遍歷
????????????????break
????????#?取相反數并將數字轉換成有效范圍以內
????????if?not?pos:
????????????res?=?-res
????????mx?=?2**31?-?1
????????mn?=?-2**31
????????res?=?min(res,?mx)
????????res?=?max(res,?mn)
????????return?res
參考資料
[1]原題鏈接: https://leetcode-cn.com/problems/ba-zi-fu-chuan-zhuan-huan-cheng-zheng-shu-lcof/
你的每個贊和在看,我都喜歡!總結
以上是生活随笔為你收集整理的在要求输入数字处找到非数字字符_剑指 Offer 67. 把字符串转换成整数 leetcode 剑指offer系列...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python 谷歌登录_用Python登
- 下一篇: html选择按键点击后锁死输入框_js实