7.整数反转

  1. 7.整数反转
    1. 7.1 题目
    2. 7.2 题解
      1. 使用字符串反转
      2. 数学方法反转
    3. 7.3 代码
    4. 7.4 运行结果

7.整数反转


7.1 题目

给你一个 32 位的有符号整数 x,返回将 x 中的数字部分反转后的结果。如果反转后整数超过 32 位的有符号整数的范围 [−2^31, 2^31 − 1],就返回 0。假设环境不允许存储 64 位整数(有符号或无符号)。

示例:

  • 示例 1:

    • 输入:x = 123
    • 输出:321
  • 示例 2:

    • 输入:x = -123
    • 输出:-321
  • 示例 3:

    • 输入:x = 120
    • 输出:21
  • 示例 4:

    • 输入:x = 0
    • 输出:0

提示:

  • -2^31 <= x <= 2^31 - 1

7.2 题解

使用字符串反转

// 方法一:使用字符串反转
// 记录是否是负数,将整数转换为绝对值字符串,转成字符数组,反转字符数组再转成字符串,再将其转换为整数
static int Reverse1(int x)
{
    // 处理特殊情况:如果输入为int类型的最小值,反转会导致溢出,返回0
    if (x == int.MinValue)
    {
        return 0;
    }

    // 将输入整数的绝对值转换为字符串,以便后续反转操作
    string str = Math.Abs(x).ToString();

    // 判断输入整数是否为负数
    bool isNegative = x < 0;

    // 将字符串转换为字符数组,以便进行反转操作
    char[] charArray = str.ToCharArray();
    Array.Reverse(charArray);

    // 尝试将反转后的字符数组转换回整数
    if (int.TryParse(new string(charArray), out int result))
    {
        // 如果输入原本是负数,则结果也为负数
        return isNegative ? -result : result;
    }

    // 如果转换失败,返回0
    return 0;
}

数学方法反转

// 方法二:数学方法反转
// 利用数学运算,将结果乘以10,取余加上,原数字除10
// 我们以 x = 123 为例,来详细说明代码的执行过程:
//
// 初始化:
//
// x = 123
// result = 0
// 第一次循环:
//
// x = 123
// result 乘以 10:result = 0 * 10 = 0
// 获取个位数字:nowNumber = 123 % 10 = 3
// 更新结果:result = 0 + 3 = 3
// 去掉个位数字:x = 123 / 10 = 12
// 第二次循环:
//
// x = 12
// result 乘以 10:result = 3 * 10 = 30
// 获取个位数字:nowNumber = 12 % 10 = 2
// 更新结果:result = 30 + 2 = 32
// 去掉个位数字:x = 12 / 10 = 1
// 第三次循环:
//
// x = 1
// result 乘以 10:result = 32 * 10 = 320
// 获取个位数字:nowNumber = 1 % 10 = 1
// 更新结果:result = 320 + 1 = 321
// 去掉个位数字:x = 1 / 10 = 0
// 循环结束:
//
// x = 0
// 结果:result = 321
// 因此,反转 123 得到 321。
static int Reverse2(int x)
{
    // 处理特殊情况:如果输入为int类型的最小值,反转会导致溢出,返回0
    if (x == int.MinValue)
    {
        return 0;
    }
    
    // 用于存储反转后的结果
    int result = 0;

    // 当输入整数不为0时执行循环
    while (x != 0)
    {
        // 等一下要将结果乘以10,检查是否会发生溢出,如果会,则返回0
        if (result < int.MinValue / 10 || result > int.MaxValue / 10)
            return 0;

        // 将结果乘以10,为下一个数字的位预留空间
        result *= 10;

        // 获取输入整数的个位数字
        int nowNumber = x % 10;

        // 将个位数字添加到结果中
        result += nowNumber;

        // 去除输入整数的个位数字
        x /= 10;
    }

    // 返回反转后的结果
    return result;
}

7.3 代码

using System;

class Program
{
    static void Main()
    {
        #region 题目

        // 给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。
        // 如果反转后整数超过 32 位的有符号整数的范围 [−231,  231 − 1] ,就返回 0。
        // 假设环境不允许存储 64 位整数(有符号或无符号)。

        // 示例 1:
        // 输入:x = 123
        // 输出:321

        // 示例 2:
        // 输入:x = -123
        // 输出:-321

        // 示例 3:
        // 输入:x = 120
        // 输出:21

        // 示例 4:
        // 输入:x = 0
        // 输出:0

        #endregion

        #region 测试

        // 示例 1
        int num1 = 123;
        int result1 = Reverse1(num1);
        Console.WriteLine($"示例1 方法1 输出:{result1}");
        int result1_2 = Reverse2(num1);
        Console.WriteLine($"示例1 方法2 输出:{result1_2}");

        // 示例 2
        int num2 = -123;
        int result2 = Reverse1(num2);
        Console.WriteLine($"示例2 方法1 输出:{result2}");
        int result2_2 = Reverse2(num2);
        Console.WriteLine($"示例2 方法2 输出:{result2_2}");

        // 示例 3
        int num3 = 120;
        int result3 = Reverse1(num3);
        Console.WriteLine($"示例3 方法1 输出:{result3}");
        int result3_2 = Reverse2(num3);
        Console.WriteLine($"示例3 方法2 输出:{result3_2}");

        // 示例 4
        int num4 = 0;
        int result4 = Reverse1(num4);
        Console.WriteLine($"示例4 方法1 输出:{result4}");
        int result4_2 = Reverse2(num4);
        Console.WriteLine($"示例4 方法2 输出:{result4_2}");

        #endregion
    }

    #region 答案
    
    // 方法一:使用字符串反转
    // 记录是否是负数,将整数转换为绝对值字符串,转成字符数组,反转字符数组再转成字符串,再将其转换为整数
    static int Reverse1(int x)
    {
        // 处理特殊情况:如果输入为int类型的最小值,反转会导致溢出,返回0
        if (x == int.MinValue)
        {
            return 0;
        }

        // 将输入整数的绝对值转换为字符串,以便后续反转操作
        string str = Math.Abs(x).ToString();

        // 判断输入整数是否为负数
        bool isNegative = x < 0;

        // 将字符串转换为字符数组,以便进行反转操作
        char[] charArray = str.ToCharArray();
        Array.Reverse(charArray);

        // 尝试将反转后的字符数组转换回整数
        if (int.TryParse(new string(charArray), out int result))
        {
            // 如果输入原本是负数,则结果也为负数
            return isNegative ? -result : result;
        }

        // 如果转换失败,返回0
        return 0;
    }
    
    // 方法二:数学方法反转
    // 利用数学运算,将结果乘以10,取余加上,原数字除10
    // 我们以 x = 123 为例,来详细说明代码的执行过程:
    //
    // 初始化:
    //
    // x = 123
    // result = 0
    // 第一次循环:
    //
    // x = 123
    // result 乘以 10:result = 0 * 10 = 0
    // 获取个位数字:nowNumber = 123 % 10 = 3
    // 更新结果:result = 0 + 3 = 3
    // 去掉个位数字:x = 123 / 10 = 12
    // 第二次循环:
    //
    // x = 12
    // result 乘以 10:result = 3 * 10 = 30
    // 获取个位数字:nowNumber = 12 % 10 = 2
    // 更新结果:result = 30 + 2 = 32
    // 去掉个位数字:x = 12 / 10 = 1
    // 第三次循环:
    //
    // x = 1
    // result 乘以 10:result = 32 * 10 = 320
    // 获取个位数字:nowNumber = 1 % 10 = 1
    // 更新结果:result = 320 + 1 = 321
    // 去掉个位数字:x = 1 / 10 = 0
    // 循环结束:
    //
    // x = 0
    // 结果:result = 321
    // 因此,反转 123 得到 321。
    static int Reverse2(int x)
    {
        // 处理特殊情况:如果输入为int类型的最小值,反转会导致溢出,返回0
        if (x == int.MinValue)
        {
            return 0;
        }
        
        // 用于存储反转后的结果
        int result = 0;

        // 当输入整数不为0时执行循环
        while (x != 0)
        {
            // 等一下要将结果乘以10,检查是否会发生溢出,如果会,则返回0
            if (result < int.MinValue / 10 || result > int.MaxValue / 10)
                return 0;

            // 将结果乘以10,为下一个数字的位预留空间
            result *= 10;

            // 获取输入整数的个位数字
            int nowNumber = x % 10;

            // 将个位数字添加到结果中
            result += nowNumber;

            // 去除输入整数的个位数字
            x /= 10;
        }

        // 返回反转后的结果
        return result;
    }
    
    #endregion
}

7.4 运行结果

示例1 方法2 输出:321
示例2 方法1 输出:-321
示例2 方法2 输出:-321
示例3 方法1 输出:21
示例3 方法2 输出:21
示例4 方法1 输出:0
示例4 方法2 输出:0


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com

×

喜欢就点赞,疼爱就打赏