題目:字串轉換整數
請你來實作一個 atoi 函式,使其能將字串轉換成整數,
首先,該函式會根據需要丟棄無用的開頭空格字符,直到尋找到第一個非空格的字符為止,接下來的轉化規則如下:
- 如果第一個非空字符為正或者負號時,則將該符號與之后面盡可能多的連續數字字符組合起來,形成一個有符號整數,
- 假如第一個非空字符是數字,則直接將其與之后連續的數字字符組合起來,形成一個整數,
- 該字串在有效的整數部分之后也可能會存在多余的字符,那么這些字符可以被忽略,它們對函式不應該造成影響,
注意:假如該字串中的第一個非空格字符不是一個有效整數字符、字串為慷訓字串僅包含空白字符時,則你的函式不需要進行轉換,即無法進行有效轉換,
在任何情況下,若函式不能進行有效的轉換時,請回傳 0 ,
提示:
本題中的空白字符只包括空格字符 ' ' ,
假設我們的環境只能存盤 32 位大小的有符號整數,那么其數值范圍為 [−231, 231 − 1],如果數值超過這個范圍,請回傳 INT_MAX (231 − 1) 或 INT_MIN (−231) ,
示例 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) ,
題目很明確讓我們把字串轉換為一個整數,
難點在于,會超出整形范圍,
我們大致分為以下幾步來解決這道問題:
- 省略掉沒用的空格
- 判斷符號
- 處理數字
在處理數字的時候,我們需要來判斷整數是否超出了整型范圍:
- ans*10 + v > INT_MAX
但是式子左邊的 *10 和 +v 也是都可能大于整型范圍的,所以我們進行適當的變型:
- ans > ( INT_MAX - v ) / 10
這樣,就可以在不超出整形范圍的情況下判斷了,
上代碼(c++):
class Solution { public: int myAtoi(string str) { int i = 0,sign = 1; int ans = 0; //跳過空格 while ( str[i] == ' ' ) ++i; //處理符號 if ( str[i] == '-' ) sign = -1; if ( str[i] == '+'|| str[i] == '-' ) i++; //處理數字 while ( str[i] >= '0'&& str[i] <= '9' ) { int v = str[i] - '0'; if ( ans > ( INT_MAX - v ) / 10 ) return sign == 1? INT_MAX:INT_MIN; ans = ans * 10 + v; i++; } return sign*ans; } };
2020-04-03-19:48:59
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/45003.html
標籤:C++
上一篇:超簡單!c++虛函式例子決議
下一篇:第一章 從C到C++
