算法进修Day-4

算法进修Day-4

7. 整数反转

难度:中等
题目要求:
给定一个32位的有符号整数x,返回将x中的数字部分反转后的结果
如果反转后整数超过32位的有符号整数的范围[ − 2 31 -2^{31} 231, 2 31 2^{31} 231 - 1],就返回0

示例1

输入:x = 123
输出:321

示例2

输入:x = -123
输出:-321

示例3

输入:x = 120
输出:21

示例4

输入:x = 0
输出:0

题解

最开始的想法:先定义两个常量,一个最大MAX,一个最小MIN,因为要反转,所以要判断是否会越界,最大值为2147483647,最小值为-2147483648,所以当反转的时候要注意不要越界

想法代码

public int Reverse(int x)
    {
        int reversed = 0;
        while (x != 0)
        {
            int lastDigit = x % 10;
            if (reversed > MAX || reversed < MIN)
            {
                return 0;
            }
            else if (reversed == MAX && lastDigit > 7 || reversed == MIN && lastDigit < -8)
            {
                return 0;
            }
            reversed = reversed * 10 + lastDigit;
            x /= 10;
        }
        return reversed;
    }

8. 字符串转换整数

难度:中等
题目要求:
实现一个myAtoi(string s) 函数,使其能够将字符串转换成一个32位有符号整数,函数算法如下:
1. 读入字符串并丢弃无用的前导空格
2. 检查下一个字符(假设还未找到字符末尾)为正还是负号,读取该字符(如果有),确定最终结果是负数还是正数,如果两者都不存在,则假定结果为正
3. 读入下一个字符,直到到达下一个非数字字符或到达输入的结尾。字符串的剩余部分将被忽略
4. 将前面步骤读入的这些数字转换为整数(即,“123” -> 123,“0032” -> “32”),如果没有读入数字,则整数为0 ,必要时更改符号(从步骤2开始)
5. 如果整数超过32位有符号整数范围[ − 2 31 -2^{31} 231 2 31 − 1 2^{31} - 1 2311],需要截断这个整数,使其保持在这个范围内,具体来说,小于 − 2 31 -2^{31} 231的整数应该被固定为 2 31 − 1 2^{31}-1 2311
6. 返回整数作为最终结果

示例1

输入:s = “42”
输出:42
解释:加粗的字符串为已经读入的字符,插入符号是当前读取的字符。
第 1 步:“42”(当前没有读入字符,因为没有前导空格)
第 2 步:“42”(当前没有读入字符,因为这里不存在 ‘-’ 或者 ‘+’)
第 3 步:“42”(读入 “42”)
解析得到整数 42 。
由于 “42” 在范围 [-231, 231 - 1] 内,最终结果为 42 。

示例2

输入:s = " -42"
输出:-42
解释:
第 1 步:" -42"(读入前导空格,但忽视掉)
第 2 步:" - 42"(读入 ‘-’ 字符,所以结果应该是负数)
第 3 步:" -42"(读入 “42”)
解析得到整数 -42 。
由于 “-42” 在范围 [-231, 231 - 1] 内,最终结果为 -42 。

示例3

输入:s = “4193 with words”
输出:4193
解释:
第 1 步:“4193 with words”(当前没有读入字符,因为没有前导空格)
第 2 步:“4193 with words”(当前没有读入字符,因为这里不存在 ‘-’ 或者 ‘+’)
第 3 步:“4193 with words”(读入 “4193”;由于下一个字符不是一个数字,所以读入停止)
解析得到整数 4193 。
由于 “4193” 在范围 [-231, 231 - 1] 内,最终结果为 4193 。

题解

最开始的想法:先遍历字符,将空格过滤,之后判断是否将字符串遍历完,如果遍历到最后一位,则返回0。如果没有遍历完,就继续像下面比对,若没有数字,则返回0。如果有数字,则对它进行进位运算,如果之后有最大值上越界,则返回 2 31 − 1 2^{31}-1 2311,若下越界,则返回 − 2 31 -2^{31} 231,如果没有,则可以直接计算后返回

想法代码

public static int MyAtoi(string s)
    {
        int length = s.Length;
        int index = 0;
        //去除空格
        while (index < length && s[index] == ' ')
        {
            index++;
        }
        //如果遍历之后下标等于字符串长度相等,返回0
        if (index == length)
        {
            return 0;
        }
        int sign = 1;
        //判断符号
        if (s[index] == '+')
        {
            index++;
        }
        else if (s[index] == '-')
        {
            sign = -1;
            index++;
        }
        const int MAX = int.MaxValue / 10;
        int num = 0;
        while (index < length && char.IsDigit(s[index]))
        {
            //将字符类型转换为int类型
            int digit = s[index] - '0';
            //判断是上越界还是下越界
            if (num > MAX || num < -MAX)
            {
                return sign > 0 ? int.MaxValue : int.MinValue;
            }
            if (num == MAX)
            {
                if (sign > 0 && digit > 7)
                {
                    return int.MaxValue;
                }
                if (sign < 0 && digit > 8)
                {
                    return int.MinValue;
                }
            }
            num = num * 10 + digit;
            index++;
        }
        return num * sign;
    }

你可能感兴趣的:(算法进修,算法,leetcode,c#)