大家早上好,今天这道题目呢,题干小编我也是读了好久才读懂,实际上这题比较简单,就是把题干翻译成代码即可,下面让我们一起看看这一题吧!
关卡八:字符串转换整数--atoi算法
请你来实现一个myAtoi(string s)函数,使其能将字符串转换成一个32位有符号整数。
算法:
示例:
我的分析
题目呢,非常的长啊!但大家不要怕,大家先理解一下,我们前面讲可以将新建一个StringBuilder对象,然后先将整数转为字符串存到一个List里面,然后将整个List采用Reverse()方法反转,最后再存入StringBuilder中,在转为字符串,最后转回整型。但是这一题给了如此多的判断条件怎么办呢?那就需要我们一步一步的拆分了,话不多说,我们直接看代码。
代码示例
public class Solution {
public int MyAtoi(string str) {
//提取有效数字符号字符
var numberStr = GetNumberStr(str);
//转换成数字
var number = GetNumber(numberStr);
return number;
}
private int GetNumber(string numberStr)
{
if (numberStr.Length < 1) return 0;
var minus = numberStr[0] == '-';
//如果第一位不是数字就必须长度为1以上
if (!char.IsNumber(numberStr[0]) && numberStr.Length < 2) return 0;
//程序开发中,免不了不同数据类型之间的转换。C#中针对转换有了一个TryParse的方法。如果转换成功则返回true。否则返回falseint.TryParse(string s,out int i) 的参数: s是要转换的字符串,i 是转换的结果
if (!long.TryParse(numberStr, out var number)) return minus ? int.MinValue : int.MaxValue;
//判断是否超过范围
if (number > 2147483647L) return int.MaxValue;
if (number < -2147483648L) return int.MinValue;
return (int)number;
}
private string GetNumberStr(string str)
{
var index = 0;
//得到第一个有效字符[+,-,0-9]位置
while (str.Length > index && char.IsWhiteSpace(str[index])) index++;
//如果超过范围或者第一位非符号或者数字就返回空
if (str.Length <= index || (!char.IsNumber(str[index]) && str[index] != '-' && str[index] != '+'))
return string.Empty;
var numberStrBuilder = new StringBuilder(str.Length);
do
{
numberStrBuilder.Append(str[index]);
index++;
} while (str.Length > index && char.IsNumber(str[index]));
//构建数字字符串
return numberStrBuilder.ToString();
}
}