請你來實現乙個 myatoi(string s) 函式,使其能將字串轉換成乙個 32 位有符號整數(類似 c/c++ 中的 atoi 函式)。
函式 myatoi(string s) 的演算法如下:
讀入字串並丟棄無用的前導空格
檢查下乙個字元(假設還未到字元末尾)為正還是負號,讀取該字元(如果有)。 確定最終結果是負數還是正數。 如果兩者都不存在,則假定結果為正。
讀入下乙個字元,直到到達下乙個非數字字元或到達輸入的結尾。字串的其餘部分將被忽略。
將前面步驟讀入的這些數字轉換為整數(即,「123」 -> 123, 「0032」 -> 32)。如果沒有讀入數字,則整數為 0 。必要時更改符號(從步驟 2 開始)。
如果整數數超過 32 位有符號整數範圍 [−231, 231 − 1] ,需要截斷這個整數,使其保持在這個範圍內。具體來說,小於 −231 的整數應該被固定為 −231 ,大於 231 − 1 的整數應該被固定為 231 − 1 。
返回整數作為最終結果。
注意:本題中的空白字元只包括空格字元 』 』 。
除前導空格或數字後的其餘字串外,請勿忽略 任何其他字元。
輸入:s = 「42」示例 1:
輸出:42
解釋:加粗的字串為已經讀入的字元,插入符號是當前讀取的字元。
第 1 步:「42」(當前沒有讀入字元,因為沒有前導空格)
^ 第 2 步:「42」(當前沒有讀入字元,因為這裡不存在 『-』 或者 『+』)
^ 第 3 步:「42」(讀入 「42」)
^ 解析得到整數 42 。 由於 「42」 在範圍 [-231, 231 - 1] 內,最終結果為 42 。
輸入:s = " -42" 輸出:-42 解釋:示例 2:
第 1 步:" -42"(讀入前導空格,但忽視掉)
^ 第 2 步:" -42"(讀入 『-』 字元,所以結果應該是負數)
^ 第 3 步:" -42"(讀入 「42」)
^ 解析得到整數 -42 。 由於 「-42」 在範圍 [-231, 231 - 1] 內,最終結果為 -42 。
示例 3:輸入:s = 「4193 with words」
輸出:4193 解釋:
第 1 步:「4193 with words」(當前沒有讀入字元,因為沒有前導空格)
^ 第 2 步:「4193 with words」(當前沒有讀入字元,因為這裡不存在 『-』 或者 『+』)
^ 第 3 步:「4193 with words」(讀入 「4193」;由於下乙個字元不是乙個數字,所以讀入停止)
^ 解析得到整數 4193 。 由於 「4193」 在範圍 [-231, 231 - 1] 內,最終結果為 4193 。
輸入:s = 「words and 987」示例 4:
輸出:0 解釋:
第 1 步:「words and987」(當前沒有讀入字元,因為沒有前導空格)
^ 第 2 步:「words and 987」(當前沒有讀入字元,因為這裡不存在 『-』 或者 『+』)
^ 第 3 步:「words and 987」(由於當前字元 『w』 不是乙個數字,所以讀入停止)
^ 解析得到整數 0 ,因為沒有讀入任何數字。 由於 0 在範圍 [-231, 231 - 1] 內,最終結果為 0 。
0 <= s.length <= 200輸入:s = 「-91283472332」示例 5:
輸出:-2147483648
解釋:第 1 步:"-91283472332"(當前沒有讀入字元,因為沒有前導空格)
^ 第 2 步:"-91283472332"(讀入 『-』 字元,所以結果應該是負數)
^ 第 3 步:"-91283472332"(讀入 「91283472332」)
^ 解析得到整數 -91283472332 。 由於 -91283472332 小於範圍 [-231, 231 - 1] 的下界,最終結果被截斷為 -231 = -2147483648 。
s 由英文本母(大寫和小寫)、數字(0-9)、』 『、』+』、』-』 和 『.』 組成
錯誤原因:為解決-2147483648,我用了2147483647存入res,然後在符號為』-'的情況下判斷res是否是2147483647,如果是則為-2147483648,這忽略了本身就是-2147483647的情況!!所以,在不得不做轉換的同時,我們要注意是否覆蓋了原本的正確結果。
class
solution
if(mark)}if
(key)
}else
} res=res*
10+temp;
}else
break;}
}}if(plusorminus==
'-')
return res==
2147483647?-
2147483648:-
1*res;
else
return res;
}}
class
solution
if(mark)}if
(key)
}else
} res=res*
10+temp;
}else
break;}
}}
除了以上方法,也可以通過新增標誌的方法去解決2中覆蓋原先正確情況的bug。
優化的思考:if else和標誌太多可不可以去掉?
解決方案參考了leetcode的官方答案
用while替換掉了mark,用兩個if語句去除掉key,值得注意的是,因為沒有用for迴圈語句,很容易出現下標越界問題,所以我們在每次使用charat()函式前都要判斷下標是否越界。並且,該**在溢位的解決方案上也進行了相應的優化,只要判斷溢位立馬return,這樣避免了後續的討論,而且,該**了合併了正負號溢位的兩種情況,if(res>integer.max_value/10||(res==integer.max_value/10&&temp>7)) return plusorminus=='+'?integer.max_value:integer.min_value;
更加的簡潔。
class
solution
//處理空白符號
if(i
length()
&&s.
charat
(i)==
'-')plusorminus=
'-';
if(i
length()
&&(s.
charat
(i)==
'-'||s.
charat
(i)==
'+')
)i++
;while
(ilength()
&&s.
charat
(i)>=
'0'&&s.
charat
(i)<=
'9')
return plusorminus==
'+'?res:-1
*res;
}}
LeetCode08 字串轉換成整數
請你來實現乙個atoi函式,使其能將字串轉換成整數。首先,該函式會根據需要丟棄無用的開頭空格字元,直到尋找到第乙個非空格的字元為止。當我們尋找到的第乙個非空字元為正或者負號時,則將該符號與之後面盡可能多的連續數字組合起來,作為該整數的正負號 假如第乙個非空字元是數字,則直接將其與之後連續的數字字元組...
08字串轉換整數 atoi
參考文獻 實現乙個atoi函式,使其能將字串轉換成整數 example 輸入 42 輸出 42首先,該函式會根據需要丟棄無用的開頭空格字元,直到尋找到第乙個非空格的字元為止。當我們尋找到的第乙個非空字元為正或者負號時,則將該符號與之後面盡可能多的連續數字組合起來,作為該整數的正負號 假如第乙個非空字...
LeetCode刷題記錄 08字串轉換整數
該函式會根據需要丟棄無用的開頭空格字元,直到尋找到第乙個非空格的字元為止。接下來的轉換規則 注意 假如字串中的第乙個非空格字元不是乙個有效的整數字元 字串為空或者字串僅包含空白字元時,則你的函式不需要進行轉換,即無法進行有效的轉換。在任何情況下,若函式不能有效地轉換時,返回0 自動機利用位運算處理 ...