请你来实现一个 myAtoi(string s) 函数,使其能将字符串转换成一个 32 位有符号整数(类似 C/C++ 中的 atoi 函数)。
函数 myAtoi(string s) 的算法如下:
1.读入字符串并丢弃无用的前导空格
2.检查下一个字符(假设还未到字符末尾)为正还是负号,读取该字符(如果有)。 确定最终结果是负数还是正数。 如果两者都不存在,则假定结果为正。
3.读入下一个字符,直到到达下一个非数字字符或到达输入的结尾。字符串的其余部分将被忽略。
4.将前面步骤读入的这些数字转换为整数(即,“123” -> 123, “0032” -> 32)。如果没有读入数字,则整数为 0 。必要时更改符号(从步骤 2 开始)。
5.如果整数数超过 32 位有符号整数范围 [?2^31, 2^31 ? 1] ,需要截断这个整数,使其保持在这个范围内。具体来说,小于 ?2^31 的整数应该被固定为 ?2^31 ,大于 2^31 ? 1 的整数应该被固定为 2^31 ? 1 。
6.返回整数作为最终结果。
注意:
本题中的空白字符只包括空格字符 ’ ’ 。
除前导空格或数字后的其余字符串外,请勿忽略 任何其他字符。
示例1:
示例 2:
示例3:
提示:
class Solution {
public int MyAtoi(string str)
{
str = str.Trim();
if (str.Length == 0) return 0;
//首位不是数字或者正负号,直接返回0
if (!char.IsDigit(str[0]) && str[0] != '-' && str[0] != '+') return 0;
// 截取前面的数字串
for (int i = 1; i < str.Length; i++)
{
if (!char.IsDigit(str[i]))
{
str = str.Substring(0, i);
break;
}
}
//只剩下符号了,直接返回0
if (str == "-" || str == "+" || str == "+-" || str == "-+") return 0;
//正常数字求结果
int result = 0;
if (int.TryParse(str, out int tryResult2))
{
result = tryResult2;
}
else
{
if (str.Contains("-")) result = int.MinValue;
else result = int.MaxValue;
}
return result;
}
}
public readonly int[,] table = new int[4, 4] {
{ 0,1,2,3 },
{ 3,3,2,3 },
{ 3,3,2,3 },
{ 3,3,3,3 }
};
class Solution {
public class Automaton
{
/// <summary>
/// 0 start , 1 signed , 2 in_number , 3 end
/// </summary>
public int state = 0;
public int sign = 1;
public int result = 0;
public readonly int[,] table = new int[4, 4] {
{ 0,1,2,3 },
{ 3,3,2,3 },
{ 3,3,2,3 },
{ 3,3,3,3 }
};
public int GetCol(char c)
{
if (char.IsWhiteSpace(c)) return 0;
if (c == '+' || c == '-') return 1;
if (char.IsDigit(c)) return 2;
return 3;
}
public void Get(char c)
{
this.state = this.table[this.state, this.GetCol(c)];
var INT_MAX = int.MaxValue;
var INT_MIN = int.MinValue;
// 0 start , 1 signed , 2 in_number , 3 end
if (this.state == 2)
{
var cInt = Convert.ToInt32(c.ToString());
if (this.sign == 1)
{
if (result > INT_MAX / 10 || (result == INT_MAX / 10 && cInt > 7)) this.result = INT_MAX;
else this.result = this.result * 10 + cInt;
}
else
{
if (result < INT_MIN / 10 || (result == INT_MIN / 10 && cInt > 8)) this.result = INT_MIN;
else this.result = this.result * 10 - cInt;
}
}
else if (this.state == 1)
{
this.sign = 1;
if (c == '-') this.sign = -1;
}
}
}
public int MyAtoi(string str)
{
Automaton automaton = new Automaton();
foreach (var c in str) automaton.Get(c);
return automaton.result;
}
}