力扣第八題——字符串轉換整數

題目介紹

請你來實現一個?myAtoi(string s)?函數,使其能將字符串轉換成一個 32 位有符號整數。

函數?myAtoi(string s)?的算法如下:

  1. 空格:讀入字符串并丟棄無用的前導空格(" "
  2. 符號:檢查下一個字符(假設還未到字符末尾)為?'-'?還是?'+'。如果兩者都不存在,則假定結果為正。
  3. 轉換:通過跳過前置零來讀取該整數,直到遇到非數字字符或到達字符串的結尾。如果沒有讀取數字,則結果為0。
  4. 舍入:如果整數數超過 32 位有符號整數范圍?[?231,? 231?? 1]?,需要截斷這個整數,使其保持在這個范圍內。具體來說,小于??231?的整數應該被舍入為??231?,大于?231?? 1?的整數應該被舍入為?231?? 1?。

返回整數作為最終結果。

示例?1:

輸入:s = "42"

輸出:42

解釋:加粗的字符串為已經讀入的字符,插入符號是當前讀取的字符。

帶下劃線線的字符是所讀的內容,插入符號是當前讀入位置。
第 1 步:"42"(當前沒有讀入字符,因為沒有前導空格)^
第 2 步:"42"(當前沒有讀入字符,因為這里不存在 '-' 或者 '+')^
第 3 步:"42"(讀入 "42")^

示例?2:

輸入:s = " -042"

輸出:-42

解釋:

第 1 步:"   -042"(讀入前導空格,但忽視掉)^
第 2 步:"   -042"(讀入 '-' 字符,所以結果應該是負數)^
第 3 步:"   -042"(讀入 "042",在結果中忽略前導零)^

示例?3:

輸入:s = "1337c0d3"

輸出:1337

解釋:

第 1 步:"1337c0d3"(當前沒有讀入字符,因為沒有前導空格)^
第 2 步:"1337c0d3"(當前沒有讀入字符,因為這里不存在 '-' 或者 '+')^
第 3 步:"1337c0d3"(讀入 "1337";由于下一個字符不是一個數字,所以讀入停止)^

示例 4:

輸入:s = "0-1"

輸出:0

解釋:

第 1 步:"0-1" (當前沒有讀入字符,因為沒有前導空格)^
第 2 步:"0-1" (當前沒有讀入字符,因為這里不存在 '-' 或者 '+')^
第 3 步:"0-1" (讀入 "0";由于下一個字符不是一個數字,所以讀入停止)^

示例 5:

輸入:s = "words and 987"

輸出:0

解釋:

讀取在第一個非數字字符“w”處停止。

提示:

  • 0 <= s.length <= 200
  • s?由英文字母(大寫和小寫)、數字(0-9)、' ''+''-'?和?'.'?組成

完整代碼

class Solution {public int myAtoi(String str) {Automaton automaton = new Automaton();int length = str.length();for (int i = 0; i < length; ++i) {automaton.get(str.charAt(i));}return (int) (automaton.sign * automaton.ans);}
}class Automaton {public int sign = 1;public long ans = 0;private String state = "start";private Map<String, String[]> table = new HashMap<String, String[]>() {{put("start", new String[]{"start", "signed", "in_number", "end"});put("signed", new String[]{"end", "end", "in_number", "end"});put("in_number", new String[]{"end", "end", "in_number", "end"});put("end", new String[]{"end", "end", "end", "end"});}};public void get(char c) {state = table.get(state)[get_col(c)];if ("in_number".equals(state)) {ans = ans * 10 + c - '0';ans = sign == 1 ? Math.min(ans, (long) Integer.MAX_VALUE) : Math.min(ans, -(long) Integer.MIN_VALUE);} else if ("signed".equals(state)) {sign = c == '+' ? 1 : -1;}}private int get_col(char c) {if (c == ' ') {return 0;}if (c == '+' || c == '-') {return 1;}if (Character.isDigit(c)) {return 2;}return 3;}
}

?思路解析

1. 類?Solution

方法?myAtoi
  • 功能:將字符串轉換為整數。
  • 參數str,表示輸入的字符串。
  • 返回值:轉換后的整數。

該方法首先創建一個?Automaton?對象,然后遍歷字符串中的每個字符,調用?Automaton?對象的?get?方法進行處理。最后返回經過處理的整數結果。

2. 類?Automaton

成員變量
  • sign:表示正負號,默認為 1(正數)。
  • ans:存儲轉換后的整數結果。
  • state:表示當前狀態,初始為 “start”。
  • table:狀態轉移表,用于根據當前狀態和字符類型確定下一個狀態。
方法?get
  • 功能:根據當前字符和狀態,更新狀態并處理整數轉換。
  • 參數c,表示當前處理的字符。

該方法首先根據當前狀態和字符類型,從狀態轉移表中獲取下一個狀態。然后根據下一個狀態執行相應的操作:

  • 如果狀態為 “in_number”,則將當前字符轉換為整數并累加到?ans?中。同時,檢查?ans?是否超出整數范圍,并進行截斷處理。
  • 如果狀態為 “signed”,則根據字符是 ‘+’ 還是 ‘-’ 設置?sign?的值。
方法?get_col
  • 功能:根據字符類型返回對應的列索引。
  • 參數c,表示當前處理的字符。
  • 返回值:列索引,用于在狀態轉移表中查找下一個狀態。

該方法根據字符類型返回對應的列索引:

  • 空格:返回 0
  • 正負號:返回 1
  • 數字:返回 2
  • 其他字符:返回 3

代碼執行流程

  1. 創建?Automaton?對象,初始化狀態為 “start”。
  2. 遍歷輸入字符串中的每個字符。
  3. 調用?Automaton?對象的?get?方法,根據當前字符和狀態進行狀態轉移。
  4. 在狀態轉移過程中,如果遇到數字,則累加到?ans?中,并處理整數范圍溢出。
  5. 如果遇到正負號,則設置?sign?的值。
  6. 遍歷結束后,根據?sign?和?ans?計算最終結果并返回。

知識點精煉

  1. 字符串處理:掌握字符串的基本操作,如遍歷和字符類型判斷。
  2. 有限狀態機:理解狀態機的概念,能夠根據不同輸入進行狀態轉移。
  3. 符號識別:能夠處理正負號,并影響最終結果的符號。
  4. 整數累加與范圍控制:在累加過程中注意整數類型的范圍限制,防止溢出。
  5. 映射表應用:利用哈希表實現狀態轉移邏輯,提高代碼的可讀性和效率

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/45546.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/45546.shtml
英文地址,請注明出處:http://en.pswp.cn/web/45546.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

TCP重傳、滑動窗口、流量控制、擁塞控制機制

目錄 1、TCP重傳機制超時重傳快速重傳 2、滑動窗口3、流量控制4、擁塞控制1、慢啟動2、擁塞避免3、擁塞發生 1、TCP重傳機制 TCP 針對數據包丟失的情況&#xff0c;會用重傳機制解決。 超時重傳 就是在發送數據時&#xff0c;設定一個定時器&#xff0c;當超過指定的時間還沒…

Ctrl+C、Ctrl+V、Ctrl+X 和 Ctrl+Z 的起源

注&#xff1a;機翻&#xff0c;未校對。 The Origins of CtrlC, CtrlV, CtrlX, and CtrlZ Explained We use them dozens of times a day: The CtrlZ, CtrlX, CtrlC, and CtrlV shortcuts that trigger Undo, Cut, Copy, and Paste. But where did they come from, and why do…

文件上傳接口

文章目錄 開發前端接口 開發前端接口 首先這個前端的文件上傳組件使用了,前端組件 首先這個接口不是一般的接口,這個接口可以提取出來,之后那里使用了,就直接放到哪里 所以這是一個萬能文件上傳接口 寫完之后選擇 頭像組件 在圖庫中添加組件 寫前端組件之后,寫了前端的組件…

Bootstrap 5 加載效果

Bootstrap 5 加載效果 Bootstrap 5 是一個流行的前端框架,它提供了豐富的組件和工具,用于快速開發響應式和移動優先的網頁。在本文中,我們將探討 Bootstrap 5 中的加載效果,包括如何實現它們以及它們在網頁設計中的作用。 什么是加載效果? 加載效果是在網頁或應用程序中…

k8s集群創建devops項目一直等待狀態,沒有發現host

問題分析&#xff1a; kubesphere在幫我們自動化創建一些智能自動化的額時候難免會發生一些小錯誤&#xff0c;devops-jenkins是一個部署也會生成一個容器組即pod&#xff0c;容器組的容器服務端口是 targetPort&#xff0c;容器組對外暴露的端口是port&#xff0c;拿devops-c…

[深度學習]基于yolov10+streamlit目標檢測演示系統設計

YOLOv10結合Streamlit構建的目標檢測系統&#xff0c;不僅極大地增強了實時目標識別的能力&#xff0c;還通過其直觀的用戶界面實現了對圖片、視頻乃至攝像頭輸入的無縫支持。該系統利用YOLOv10的高效檢測算法&#xff0c;能夠快速準確地識別圖像中的多個對象&#xff0c;并標注…

Billu_b0x靶機

信息收集 使用arp-scan 生成網絡接口地址來查看ip 輸入命令&#xff1a; arp-scan -l 可以查看到我們的目標ip為192.168.187.153 nmap掃描端口開放 輸入命令&#xff1a; nmap -min-rate 10000 -p- 192.168.187.153 可以看到開放2個端口 nmap掃描端口信息 輸入命令&…

配置PYTHONPATH環境變量

配置PYTHONPATH環境變量 前言Win系統臨時配置永久配置 Linux系統臨時配置永久配置 前言 在運行py腳本時不僅需要import官方庫&#xff0c;經常會import自己編寫的腳本&#xff0c;但此時會出現模塊找不到的如下報錯。解決方法是配置PYTHONPATH&#xff0c;下文介紹Win系統和Li…

禹神:一小時快速上手Electron,前端Electron開發教程,筆記。一篇文章入門Electron

一、Electron是什么 簡單的一句話&#xff0c;就是用htmlcssjsnodejs&#xff08;Native Api&#xff09;做兼容多個系統&#xff08;Windows、Linux、Mac&#xff09;的軟件。 官網解釋如下(有點像繞口令)&#xff1a; Electron是一個使用 JavaScript、HTML 和 CSS 構建桌面…

Resources.Load返回null

Resources.Load返回null 在unity中Resources.Load從Assets下的任意Resources目錄下讀取資源&#xff0c;比如從Assets\Resources下讀取Cube&#xff08;預制體&#xff09;&#xff0c;當然也可以讀取其他資源 代碼為 GameObject prefab Resources.Load<GameObject>(…

微軟Edge瀏覽器深度解析:性能、安全性與特色功能全面評測

一、引言 自Windows 10操作系統推出以來&#xff0c;微軟Edge瀏覽器作為默認的網頁瀏覽器&#xff0c;憑借其現代化的設計和出色的性能表現&#xff0c;逐漸獲得了用戶的認可。本文旨在對Edge瀏覽器進行深入分析&#xff0c;探討其在多個方面的表現。 二、界面與操作體驗 界面…

在 PostgreSQL 里如何處理數據的存儲優化和數據庫備份的效率平衡?

&#x1f345;關注博主&#x1f397;? 帶你暢游技術世界&#xff0c;不錯過每一次成長機會&#xff01;&#x1f4da;領書&#xff1a;PostgreSQL 入門到精通.pdf 文章目錄 在 PostgreSQL 里如何處理數據的存儲優化和數據庫備份的效率平衡&#xff1f;一、數據存儲優化&#x…

HTML表格表單及框架標簽

一.表格標簽 1.<table></table> 創建表格 2.<caption></caption> 表格的標題 3.<tr></tr>Table Row&#xff08;表格行&#xff09; 4.<td></td>Table Data&#xff08;表格數據&#xff09;其中有屬性rowspan"2&quo…

Linux操作系統——數據庫

數據庫 sun solaris gnu 1、分類&#xff1a; 大型 中型 小型 ORACLE MYSQL/MSSQL SQLITE DBII powdb 關系型數據庫 2、名詞&#xff1a; DB 數據庫 select update database DBMS 數據…

Go中的defer看似很簡單,實則一點都不難

Golang 中的 Defer 在Go語言中&#xff0c;defer語句用于將一個函數調用推遲到外圍函數返回之后執行。它常用于確保某些操作在函數結束時一定會執行&#xff0c;例如資源釋放、文件關閉等。 基本語法 defer語句的基本使用方法如下&#xff1a; func main() {defer fmt.Prin…

距離變換 Distance Transformation

以下為該學習地址的學習筆記&#xff1a;Distance transformation in image - Python OpenCV - GeeksforGeeks 其他學習資料&#xff1a;Morphology - Distance Transform 簡介 距離變換是一種用于計算圖像中每個像素與最近的非零像素之間距離的技術。它通常用于圖像分割和物體…

51單片機5(GPIO簡介)

一、序言&#xff1a;不論學習什么單片機&#xff0c;最簡單的外設莫過于I口的高低電平的操作&#xff0c;接下來&#xff0c;我們將給大家介紹一下如何在創建好的工程模板上面&#xff0c;通過控制51單片機的GPIO來使我們的開發板上的LED來點亮。 二、51單片機GPIO介紹&#…

第三節SHELL腳本中的變量與運算(1.1-1.5)

一,腳本中的變量 1,1什么是變量 在編寫程序是,通常會遇到被操作對象不固定的情況我們需要用一串固定的字符來的表示不固定的值,這就是變量存在的根本意義變量的實現原理就是內存存儲單元的一個符合名稱 1,2 變量的命名規則 變量的名稱中只能包含數字,大小寫字母以及下劃線 …

PySide在Qt Designer中使用QTableView 顯示表格數據

在 PySide6 中&#xff0c;可以使用 Qt Model View 架構中的 QTableView 部件來顯示和編輯表格數據。 1、創建ui文件 在Qt Designer中新建QMainWindow&#xff0c;命名為csvShow.ui。QMainWindow上有兩個部件&#xff1a;tableview和btn_exit。 2、使用pyuic工具將ui文件轉換為…

Kafka(四) Consumer消費者

一&#xff0c;基礎知識 1&#xff0c;消費者與消費組 每個消費者都有對應的消費組&#xff0c;不同消費組之間互不影響。 Partition的消息只能被一個消費組中的一個消費者所消費&#xff0c; 但Partition也可能被再平衡分配給新的消費者。 一個Topic的不同Partition會根據分配…