LeetCode-C#-0008.字符串转换整数

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;
        }
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值