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