[LeetCode解題攻略] 8. String to Integer (atoi)

更新於 2024/12/04閱讀時間約 5 分鐘

這篇文章將介紹 LeetCode 題目 8. String to Integer (atoi),這是一道實現 atoi 函數的題目。此題的核心在於如何解析字串中的數字並轉換成整數,同時需要考慮各種特殊情況和邊界條件。


題目概述

給定一個字串 s,將字串轉換為一個 32 位整數(類似於 C/C++ 中的 atoi 函數)。需要處理一些特殊情況,比如:

  • 字串中是否有空格。
  • 是否存在正負號。
  • 數字是否會溢出。
  • 非數字字符的截斷。

範例:

Input: s = "42"
Output: 42

Input: s = "-042"
Output: -42

Input: s = "0-1"
Output: 0

Input: s = "words and 987"
Output: 0

Input: s = "-91283472332"
Output: -2147483648

思路分析

此題的實現分為多個步驟,需要依次處理空格、正負號、數字轉換和溢出判斷。以下是詳細步驟:

  1. 忽略開頭的空格:先去除字串左側的空格。
  2. 處理符號:如果遇到 +-,記錄符號(預設為正)。
  3. 轉換數字:遍歷字串中的字符,遇到數字字符時進行數字組合;遇到非數字字符時停止。
  4. 檢查溢出:轉換過程中保持數字在 32 位整數範圍內,如果溢出,返回邊界值。

解法:逐步解析字串

為了實現這個過程,可以使用字串操作來逐步處理每個字符。此方法會遍歷字串中的每一部分,並在不滿足條件時結束。

步驟

  1. 去除開頭空格。
  2. 判斷符號,將結果的符號設為 sign
  3. 遍歷數字字符並累積數字到 num
  4. 在累積數字時檢查是否溢出。
  5. 返回結果,考慮符號和溢出。

實作 (Python)

def myAtoi(s):class Solution:
def myAtoi(self, s: str) -> int:

INT_MAX, INT_MIN = 2**31 - 1, -2**31
i, n = 0, len(s)
sign = 1
num = 0

# 去除開頭空格
while i < n and s[i] == ' ':
i += 1

# 處理符號
if i < n and s[i] in ('+', '-'):
sign = -1 if s[i] == '-' else 1
i += 1

# 轉換數字字符
while i < n and s[i].isdigit():
digit = int(s[i])

# 檢查溢出條件
if num > (INT_MAX - digit) // 10:
return INT_MAX if sign == 1 else INT_MIN

num = num * 10 + digit
i += 1

return sign * num

複雜度分析

  • 時間複雜度:O(n),其中 n 是字串長度。我們最多遍歷一次字串。
  • 空間複雜度:O(1),只使用了固定的變數。

特殊情況和邊界條件

在解題時,需考慮以下情況:

  1. 只有空格:直接返回 0。
  2. 只有符號:無數字時返回 0。
  3. 大於 32 位整數的數字:如 "-91283472332" 會返回 -2147483648
  4. 數字後有非數字字符:如 "4193 with words",僅解析數字部分。

總結

這道題目是對字串解析和數字處理的綜合考驗。此解法按步驟進行處理,適用於各種邊界情況:

  • 數字解析:按位解析,並處理溢出。
  • 邊界條件:詳細考慮各種特殊情況和輸入格式。

希望這篇文章能幫助你掌握 String to Integer (atoi) 的解法!

歡迎來到我的部落格!這裡記錄了軟體工程師的日常生活點滴,並分享程式設計與演算法的實用教學。無論你是初學者還是有經驗的開發者,都能在這裡找到深入淺出的技術解析與實戰技巧。此外,我也會分享工作中的心路歷程與學習心得,讓你不僅學到技術,更能瞭解軟體開發的實際應用與挑戰。希望透過這個平台,能與你共同成長,激發對技術的熱情!
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
這篇文章將解析 LeetCode 題目 7. Reverse Integer,這是一道簡單但容易出錯的數字操作題。題目要求將一個整數反轉後返回,並需考慮邊界條件和溢出情況。讓我們逐步解題,並討論不同的解法。
這篇部落格文章將詳細解析 LeetCode 題目 6. Zigzag Conversion。這是一道字串操作題,要求將字串以 "Z" 字形排列,再按行讀取形成新的字串。以下是此題的詳細思路和解法,幫助你有效掌握此類問題。
這篇文章要解說的是 LeetCode 題目 5. Longest Palindromic Substring,這是一道典型的字串題,重點在於找出輸入字串中的最長回文子字串。下面是這篇解題教學的詳細分析與多種解法,讓你能全面掌握這題的技巧。
給定兩個已排序的陣列 nums1 和 nums2,請找到並返回這兩個陣列的中位數。要求時間複雜度為 O(log(min(m, n))),其中 m 和 n 分別是兩個陣列的長度。
給定一個字串 s,請找出其中不含重複字母的最長子字串的長度。
在這篇文章中,我們將深入探討 LeetCode 題目「2. Add Two Numbers」的解法。這道題目考察對鏈結串列 (Linked List) 操作和進位處理的掌握。
這篇文章將解析 LeetCode 題目 7. Reverse Integer,這是一道簡單但容易出錯的數字操作題。題目要求將一個整數反轉後返回,並需考慮邊界條件和溢出情況。讓我們逐步解題,並討論不同的解法。
這篇部落格文章將詳細解析 LeetCode 題目 6. Zigzag Conversion。這是一道字串操作題,要求將字串以 "Z" 字形排列,再按行讀取形成新的字串。以下是此題的詳細思路和解法,幫助你有效掌握此類問題。
這篇文章要解說的是 LeetCode 題目 5. Longest Palindromic Substring,這是一道典型的字串題,重點在於找出輸入字串中的最長回文子字串。下面是這篇解題教學的詳細分析與多種解法,讓你能全面掌握這題的技巧。
給定兩個已排序的陣列 nums1 和 nums2,請找到並返回這兩個陣列的中位數。要求時間複雜度為 O(log(min(m, n))),其中 m 和 n 分別是兩個陣列的長度。
給定一個字串 s,請找出其中不含重複字母的最長子字串的長度。
在這篇文章中,我們將深入探討 LeetCode 題目「2. Add Two Numbers」的解法。這道題目考察對鏈結串列 (Linked List) 操作和進位處理的掌握。
你可能也想看
Google News 追蹤
Thumbnail
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
Thumbnail
分享一個猜數字的遊戲題目,給予提示讓玩家找出正確的四位數密碼。
Thumbnail
LeetCode 是一個程式語言版的線上題庫平臺,提供題目描述、程式碼區塊、解題者分享的解法和疑問討論。藉由這篇文章分享我在 LeetCode 上的使用經驗和觀點,包括刷題的重要性、解題心態和練習目標。
Thumbnail
題目敘述 Patching Array 題目給定一個整數陣列, 請問還要補上多少個數字,才能用這些數字的和拼湊出所有1~n的整數。
Thumbnail
題目敘述 題目的情境是設計並且實現一個包含所有正整數的數據流,以set集合的方式存在。 數據流 = {1, 2, 3, 4, ..., ∞} 要求我們去實現定義好的function介面: SmallestInfiniteSet()建構子,初始化這個包含所有正整數的數據流。 int po
Thumbnail
題目敘述 題目會給定一個整數陣列arr,要求我們判斷是否每個元素的出現次數都不同? 題目的原文敘述 測試範例 Example 1: Input: arr = [1,2,2,1,1,3] Output: true Explanation: The value 1 has 3 occurre
Thumbnail
題目敘述 題目會給定我們兩個字串word1 和 word2。 允許我們不限制次數進行下列兩種操作: 任意調換其中兩個字元的位置。 把字串中的某個字元全部置換成另一個字元,同時把另一個字元同時置換成某個字元。(例如把字串中原本的a都換成b,把原本的b都換成a) 問我們能不能通過上述兩項操作,
Thumbnail
題目敘述 題目會給我們兩個字串作為輸入,分別是字串s和字串t,問我最少要做幾次字元轉換,讓字串t和字串s成為Anagram"同字母異序詞"? 註: 例如 god 和 dog 就是 Anagram 同字母異序詞,也是就說,組成字母相同,但是順序可以重新排列。 題目的原文敘述 測試範例 Ex
Thumbnail
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
Thumbnail
分享一個猜數字的遊戲題目,給予提示讓玩家找出正確的四位數密碼。
Thumbnail
LeetCode 是一個程式語言版的線上題庫平臺,提供題目描述、程式碼區塊、解題者分享的解法和疑問討論。藉由這篇文章分享我在 LeetCode 上的使用經驗和觀點,包括刷題的重要性、解題心態和練習目標。
Thumbnail
題目敘述 Patching Array 題目給定一個整數陣列, 請問還要補上多少個數字,才能用這些數字的和拼湊出所有1~n的整數。
Thumbnail
題目敘述 題目的情境是設計並且實現一個包含所有正整數的數據流,以set集合的方式存在。 數據流 = {1, 2, 3, 4, ..., ∞} 要求我們去實現定義好的function介面: SmallestInfiniteSet()建構子,初始化這個包含所有正整數的數據流。 int po
Thumbnail
題目敘述 題目會給定一個整數陣列arr,要求我們判斷是否每個元素的出現次數都不同? 題目的原文敘述 測試範例 Example 1: Input: arr = [1,2,2,1,1,3] Output: true Explanation: The value 1 has 3 occurre
Thumbnail
題目敘述 題目會給定我們兩個字串word1 和 word2。 允許我們不限制次數進行下列兩種操作: 任意調換其中兩個字元的位置。 把字串中的某個字元全部置換成另一個字元,同時把另一個字元同時置換成某個字元。(例如把字串中原本的a都換成b,把原本的b都換成a) 問我們能不能通過上述兩項操作,
Thumbnail
題目敘述 題目會給我們兩個字串作為輸入,分別是字串s和字串t,問我最少要做幾次字元轉換,讓字串t和字串s成為Anagram"同字母異序詞"? 註: 例如 god 和 dog 就是 Anagram 同字母異序詞,也是就說,組成字母相同,但是順序可以重新排列。 題目的原文敘述 測試範例 Ex