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

01、long类型字符串转换法
虽然题目要求不允许使用64位整数,但是我们还是先使用最简单最直观的最符合思维逻辑的方式实现,然后以此打开思维寻找出更好的方法。
看到此题我第一反应就是直接把整数x转为字符串,然后直接调用字符串方法反转字符串,最后把反转后的字符串转换为long类型,同时比较是否再有效范围内即可。
当然这是大致解题思路,其中还有许多细节需要处理。
首先需要处理负号问题,如果是负数我们需要取其绝对值,然后再反转绝对值,而在取绝对值时需要注意int的最小值int.MinValue为-2147483648,而int.MaxValue最大值为2147483647,因此我们不能直接对int整数x直接取绝对值,而需要先把x转为long类型整数,不然会报错。
然后把绝对值反转成字符数组,同时判断正负号,如果是负数则需要在字符数组前加上负号’-’。
最后直接使用long.TryParse方法对字符数组进行转换,同时判断其有效范围,并输出结果,具体代码如下:
//字符串long
public static int ReverseLongString(int x)
{
//是否为负数
var isNegative = x < 0;
//取绝对值,必须要先转为long类型
//否则int.MinValue -2147483648会报错
var abs = Math.Abs((long)x);
//把值转为字符串并反转,得到字符集合
var reversedChars = abs.ToString().Reverse();
if (isNegative)
{
//如果是负数则在字节数组前加入负号'-'
reversedChars = reversedChars.Prepend('-');
}
//转换为long类型,并且是有效的int值,则返回结果
if (long.TryParse(reversedChars.ToArray(), out long result) && result >= int.MinValue && result <= int.MaxValue)
{
return (int)result;
}
return 0;
}
02、int类型字符串转换法
既然题目中要求我们不能使用64位整数long类型,那么我们是否可以直接int类型进行转换呢?
根据上一个解法,同样的思路,我们先把int整数x转为字符串,然后直接使用int.TryParse进行转换即可。这样可以利用转换失败过滤掉所有溢出的值。
具体实现代码如下:
//字符串int
public static int ReverseIntString(int x)
{
//把值转为字符串,并去掉负号'-',最后反转,得到字符集合
var reversed = x.ToString().TrimStart('-').Reverse();
//转换为int,成功则返回
if (int.TryParse(reversed.ToArray(), out int result))
{
//根据原始符号,返回结果
return x < 0 ? -result : result;
}
return 0;
}
03、数学方法
上面两个方法本质还是通过字符串转换,就效率来说是比较低的,因此我们可以通过数学计算的方式来实现其转换。

如上图,我们以把12345反转为例,详解讲解反转过程。
(1)通过12345%10,获取到尾数字5,而尾数字又将作为新数值的首数字,新数值5;
(2)通过1234%10,获取到尾数字4,新数值为5*10+4=54;
(3)通过123%10,获取到尾数字3,新数值为54*10+3=543;
(4)通过12%10,获取到尾数字2,新数值为543*10+2=5432;
(5)通过1%10,获取到尾数字1,新数值为5432*10+1=54321;
其中还有一个重点是关于溢出的判断,前两个方法本质都是通过转换方法触发异常来拦截溢出,而在此方法中我们可以在实时计算的过程中直接判断出是否溢出。
因为32位有符号整数x的取值范围是-2147483648<=x<=2147483647,如果要保证反转过来不溢出,则在处理到第九位的时候整个值应该在(-214748364,214748364)之间,不然结果肯定会溢出,而有效的int值首位数字最大为2,即使反转过来也不可能大于7或小于-8,因此只需要判断第九位数字是否合法即可完成溢出判断。
具体实现代码如下:
//数学方法
public static int ReverseMath(int x)
{
var result = 0;
while (x != 0)
{
//判断溢出,因为输入的是32位的有符号整数 x
//即输入的 -2147483648<=x<=2147483647
//所以翻转后的最后一位是1或2并不会导致溢出
//因此只需判断九位数 > int.MaxValue / 10 或者 < int.MinValue / 10
if (result < int.MinValue / 10 || result > int.MaxValue / 10)
{
return 0;
}
//获取当前末尾的数字
var digit = x % 10;
//去掉末尾数字
x /= 10;
//反转并累积结果
result = result * 10 + digit;
}
return result;
}
04、基准测试
我们做个简单的基准测试,分别对三种方法进行100万次随机生成整数值在范围-2147483648至2147483647之间的值进行测试,得到如下结果。

通过上图不难发现数学方法在整体性能方面远远高于字符串处理方式。
注:测试方法代码以及示例源码都已经上传至代码库,有兴趣的可以看看。https://gitee.com/hugogoos/Planner
LeetCode题集-7 - 整数反转的更多相关文章
- 【LeetCode】Reverse Integer(整数反转)
这道题是LeetCode里的第7道题. 题目描述: 给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转. 示例 1: 输入: 123 输出: 321 示例 2: 输入: -123 ...
- Leetcode(7)整数反转
Leetcode(6)Z字形变换 [题目表述]: 给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转. 第一次:转字符串处理 执行用时:40 ms: 内存消耗:11.6MB 效果: ...
- [LeetCode]7. Reverse Integer整数反转
Given a 32-bit signed integer, reverse digits of an integer. Example 1: Input: 123 Output: 321 Examp ...
- leetcode 题集
775. Global and Local Inversions 统计相邻元素组成的逆序对(local inversion)和全局逆序对的数量(global inversion) 思路:local i ...
- Leetcode题库——12.整数转罗马数字
@author: ZZQ @software: PyCharm @file: intToRoman.py @time: 2018/9/28 21:59 要求: 字符 数值 I 1 V 5 X 10 L ...
- Leetcode7_整数反转
题目 给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转. 示例 1: 输入: 123输出: 321 示例 2: 输入: -123输出: -321 示例 3: 输入: 120输出: ...
- Leetcode题库——7.反转整数
@author: ZZQ @software: PyCharm @file: IntReverse.py @time: 2018/9/16 16:36 要求:整数反转(给定一个 32 位有符号整数,将 ...
- Leetcode(力扣) 整数反转
Leetcode 7.整数反转 给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转. 示例: 输入: -123 输出: -321 注意: 假设我们的环境只能存储得下 32 位的有符 ...
- Newtonsoft.Json C# Json序列化和反序列化工具的使用、类型方法大全 C# 算法题系列(二) 各位相加、整数反转、回文数、罗马数字转整数 C# 算法题系列(一) 两数之和、无重复字符的最长子串 DateTime Tips c#发送邮件,可发送多个附件 MVC图片上传详解
Newtonsoft.Json C# Json序列化和反序列化工具的使用.类型方法大全 Newtonsoft.Json Newtonsoft.Json 是.Net平台操作Json的工具,他的介绍就 ...
- C# 算法题系列(二) 各位相加、整数反转、回文数、罗马数字转整数
各位相加 给定一个非负整数 num,反复将各个位上的数字相加,直到结果为一位数. 示例: 输入: 输出: 解释: 各位相加的过程为: + = , + = . 由于 是一位数,所以返回 . 进阶:你可以 ...
随机推荐
- 1 月 25 日见|Flutter Forward 活动日程表正式发布!
2023 年 1 月 25 日 (正月初四),我们将在肯尼亚首都内罗毕举办 Flutter Forward 大会,并同时开启线上直播.本次活动将展示最新的 Flutter 技术更新,包括一个主题演讲以 ...
- [OI] 欢夏!邪龙?马拉车!
标题来自原神 算法概述 Manacher 算法 用途:寻找回文串,最板子的情况下用于字符串的回文子串计数 给定一个字符串 \(S\),求出它全部的回文子串 容易想到一种暴力的 \(n^{2}\) 做法 ...
- Docker修改IP地址方法
一.查看Docker IP root@master:/# ifconfig docker0 docker0: flags=4099<UP,BROADCAST,MULTICAST> mtu ...
- MyBatis的常见面试题
MyBatis 1.什么是MyBatis MyBatis是一款优秀的半自动化的持久层框架.支持自定义 SQL.存储过程以及高级映射. 2.MyBatis的特点? 简单.灵活.解耦.丰富的标签 3.My ...
- 多款国产操作系统安装数据库干货文档汇总(含Oracle/MySQL/国产数据库等)
随着国产化的逐步推进,越来越多的企业选择将数据库安装在国产操作系统上.为帮助大家了解国产操作系统上的数据库成功搭建案例与搭建方式,本文整理了墨天轮数据技术社区上用户分享的实操文档,涵盖银河麒麟.中标麒 ...
- centos7.6源码方式安装python3.6.8
1 安装依赖包 centos7.6是没有自带python3的 [root@opgs201 ~]# cat /etc/redhat-release CentOS Linux release 7.6.18 ...
- 基础控件(ListView,RecyclerView,单位和尺寸,ViewPager,ViewPager2)
ListView list_item.xml <?xml version="1.0" encoding="utf-8"?> <LinearLa ...
- java程序设置开机自启
Linux系统jar包开机自启 第一步:创建service文件 sudo nano etc/systemd/system/myapp.service 第二步:将下面代码复制到刚才创建的文件里面,保存 ...
- NES 模拟器中音画同步问题
背景 模拟器是与游戏和播放器都有相似之处的系统.模拟器与游戏的相似之处,在于都需要一个采集输入--执行逻辑--然后按一定帧率(通常是 60 FPS)把画面显示出来的循环.但是模拟器又需要模拟音频设备, ...
- JS 本地存储 localStorage 操作总结
现在前端做数据存储,跨页面传值,localStorage是一个很好的方式,以键值对的方式存储,也方便取值赋值,下面说一说使用方法和一些常见的使用技巧. 1.存值共有3种方式,localStorage相 ...