0.声明
该题目来源于LeetCode
如有侵权,立马删除。
解法不唯一,如有新解法可一同讨论。
1.题目
0008字符串转换整数
请你来实现一个myAtoi(string s)函数,使其能将字符串转换成一个32位有符号整数(类似 C/C++ 中的 atoi 函数)。
函数myAtoi(string s)的算法如下:
读入字符串并丢弃无用的前导空格
检查下一个字符(假设还未到字符末尾)为正还是负号,读取该字符(如果有)。确定最终结果是负数还是正数。
如果两者都不存在,则假定结果为正。
读入下一个字符,直到到达下一个非数字字符或达到输入的结尾。字符串的其余部分将被忽略。
将前面步骤读入的这些数字转换为整数(即,“123” -> 123,“0032” -> 32)。如果没有读入数字,则整数为0。必要时更改符号(从步骤2开始)。
如果整数超过32位有符号整数范围 [−2^31, 2^31 − 1] ,需要截断这个整数,使其保持在这个范围内。
具体来说,小于 −2^31 的整数应该被固定为 −2^31 ,大于 2^31 − 1 的整数应该被固定为 2^31 − 1 。
返回整数作为最终结果。
注意:
本题中的空白字符只包括空格字符’ '。
除前导空格或数字后的其余字符串外,请勿忽略 任何其他字符。
示例 1:
输入:s = “42”
输出:42
解释:加粗的字符串为已经读入的字符,插入符号是当前读取的字符。
第 1 步:“42”(当前没有读入字符,因为没有前导空格)
-
^
第 2 步:“42”(当前没有读入字符,因为这里不存在’-‘或者’+')
-
^
第 3 步:“42”(读入"42")
-
^
解析得到整数 42 。
由于"42"在范围[-2^31, 2^31 - 1]内,最终结果为42。
示例 2:
输入:s = " -42"
输出:-42
解释:
第 1 步:" -42"(读入前导空格,但忽视掉)
-
^
第 2 步:" -42"(读入’-'字符,所以结果应该是负数)
-
^
第 3 步:" -42"(读入"42")
-
^
解析得到整数 -42 。
由于"-42"在范围[-2^31, 2^31 - 1]内,最终结果为-42。
示例 3:
输入:s = “4193 with words”
输出:4193
解释:
第 1 步:“4193 with words”(当前没有读入字符,因为没有前导空格)
-
^
第 2 步:“4193 with words”(当前没有读入字符,因为这里不存在 ‘-’ 或者 ‘+’)
-
^
第 3 步:“4193 with words”(读入 “4193”;由于下一个字符不是一个数字,所以读入停止)
-
^
解析得到整数 4193 。
由于"4193"在范围[-2^31, 2^31 - 1]内,最终结果为4193。
提示:
0 <= s.length <= 200
s由英文字母(大写和小写)、数字(0-9)、’ ‘、’+‘、’-‘和’.'组成
2.代码
namespace LeetCode_0008字符串转换整数
{
class Program
{
static void Main(string[] args)
{
string s = "4193 with words";
LeetCode_MyAtoi lm = new LeetCode_MyAtoi();
int i_Result = lm.MyAtoi(s);
Console.WriteLine(i_Result);
Console.ReadKey();
}
}
class LeetCode_MyAtoi
{
public int MyAtoi(string s)
{
int i_Length = s.Length;
int i_Index = 0;
while (i_Index < i_Length && s[i_Index] == ' ')
i_Index++;
if (i_Length == i_Index)
return 0;
int i_Sign = 1;
if (s[i_Index] == '+')
i_Index++;
else if (s[i_Index] == '-')
{
i_Sign = -1;
i_Index++;
}
int i_Max = int.MaxValue / 10;
int i_Min = int.MinValue / 10;
int i_Num = 0;
while (i_Index < i_Length && char.IsDigit(s[i_Index]))
{
int i_Digit = s[i_Index] - '0';
if (i_Num > i_Max || i_Num < i_Min)
{
return i_Sign > 0 ? int.MaxValue : int.MinValue;
}
else if (i_Num == i_Max)
{
if (i_Sign > 0 && i_Digit > 7)
return int.MaxValue;
else if (i_Sign < 0 && i_Digit > 8)
return int.MinValue;
}
i_Num = i_Num * 10 + i_Digit;
i_Index++;
}
return i_Num * i_Sign;
}
}
}