日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

在要求输入数字处找到非数字字符_剑指 Offer 67. 把字符串转换成整数 leetcode 剑指offer系列...

發布時間:2023/12/2 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 在要求输入数字处找到非数字字符_剑指 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系列...的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。