タイトル説明
あなたが機能を実装するために税引後営業利益、それは文字列を整数に変換することができます。
まず、空白文字で始まります関数は、これまでの最初の非空白文字を見つけるまで、必要であれば無用捨てます。
私たちは、整数の印として、後に連続した数字を上にして、可能な限り、最初の非空白文字が正または負の数であるシンボルのコンビネーションを見つけた場合、最初の非空白文字がある場合連続した数字が整数を形成するために結合された直後の図。
また、余分な文字を存在する可能性がある、有効な整数部分の後の文字列に加えて、これらの文字は無視することができ、彼らは機能に影響はありません。
注:最初の非空白文字の文字列が有効な整数文字列が空でない場合、または空白のみの文字列が含まれている場合、あなたは変換の機能である必要はありません。
いずれにしても、機能が効果的に変換できない場合は、0が返されます。
思考
それは「+」である場合、または最初の最初の非文字領域、負のレコードを検索するためのスペースをスキップ「 - 」サイクル世代連続番号を継続し、元の位置に追加される、のうち中間ループ境界か否かを検出する、非数値検出
コード
この方法の一つ:
class Solution {
public:
int myAtoi(string str) {
int len = str.length();
if (len == 0)
return 0;
int start = 0;
bool positive = true;
while (str[start] == ' ')
{
start++;
if (start == len)
return 0;
}
if (str[start] == '-')
{
positive = false;
start++;
}
else if (str[start] == '+')
{
start++;
}
long long res = 0;
for (int i = start; i<len; i++)
{
if (str[i] >= '0' && str[i] <= '9')
{
res = res * 10 + str[i] - '0';
}
else
break;
if (res - 1 >= INT_MAX)
{
if (positive == false)
return INT_MIN;
else
return INT_MAX;
}
}
if (positive == false)
return -res;
else
return res;
}
};
方法2:
class Solution {
public:
int myAtoi(string str) {
unsigned long len = str.length();
// 去除前导空格
int index = 0;
while (index < len) {
if (str[index] != ' ') {
break;
}
index++;
}
if (index == len) {
return 0;
}
int sign = 1;
// 处理第 1 个非空字符为正负符号,这两个判断需要写在一起
if (str[index] == '+') {
index++;
} else if (str[index] == '-') {
sign = -1;
index++;
}
// 根据题目限制,只能使用 int 类型
int res = 0;
while (index < len) {
char curChar = str[index];
if (curChar < '0' || curChar > '9') {
break;
}
if (res > INT_MAX / 10 || (res == INT_MAX / 10 && (curChar - '0') > INT_MAX % 10)) {
return INT_MAX;
}
if (res < INT_MIN / 10 || (res == INT_MIN / 10 && (curChar - '0') > -(INT_MIN % 10))) {
return INT_MIN;
}
res = res * 10 + sign * (curChar - '0');
index++;
}
return res;
}
};