🧮 Algorithm Notebook
1、算法准备
1.1 牛客网编程OJ的典型输入输出
2、算法框架
2.1 动态规划
2.1.1 斐波那契数列
2.1.2 背包问题
2.1.3 贪心算法
2.1.4 序列和数组类问题
2.1.5 编辑距离
2.1.6 高楼扔鸡蛋
2.1.7 股票问题系列通解
2.1.8 最长有效括号
2.1.9 剪绳子
2.1.10 正则表达式匹配
2.2 二分查找
2.2.1 二分查找框架
2.2.2 搜索旋转排序数组
2.3 链表
2.3.1 反转链表
2.3.2 相交链表
2.3.3 合并链表
2.3.4 链表中倒数第k个节点
2.3.5 复制带随机指针的链表
2.4 排序算法
2.4.1 常见排序算法
2.5 二叉树
2.5.1 二叉树遍历
2.5.2 岛屿问题
2.5.3 二叉树路径问题
2.5.4 构造二叉树
2.6 回溯算法
2.6.1 回溯算法解题框架
2.6.2 N皇后
2.7 数组
2.7.1 删除有序数组中的重复项
2.7.2 滑动窗口最大值
2.7.3 调整数组顺序使奇数位于偶数前面
2.7.4 螺旋矩阵
2.7.5 多数元素
2.7.6 最大数
2.7.7 和为s的两个数字
2.7.8 构建乘积数组
2.7.9 两数之和
2.8 字符串
2.8.1 最小覆盖子串
2.8.2 比较版本号
2.8.3 验证IP地址
2.8.4 基本计算器 II
2.8.5 字符串解码
2.8.6 移掉 K 位数字
2.8.7 无重复字符的最长子串
2.8.8 第一个只出现一次的字符
2.8.9 翻转字符串里的单词
2.8.10 字符串转换整数 (atoi)
2.8.11 字符串四则运算
2.9 栈
2.9.1 最小栈
2.9.2 弹出序列
2.10 数学
2.10.1 用 Rand7() 实现 Rand10()
2.10.2 只出现一次的数字
2.10.3 整数反转
2.10.4 求1+2+…+n
2.10.5 二进制中1的个数
2.10.6 幂运算
2.10.7 1~n 整数中 1 出现的次数
2.10.8 数字序列中某一位的数字
2.10.9 丑数
2.10.10 n个骰子的点数
2.10.11 圆圈中最后剩下的数字
2.10.12 不用加减乘除做加法
2.10.13 x 的平方根
2.11 设计
2.11.1 LRU 缓存机制
-
+
游客
注册
登录
整数反转
## 1 题目 给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。 如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1] ,就返回 0。 假设环境不允许存储 64 位整数(有符号或无符号)。 **示例 1:** ```txt 输入:x = 123 输出:321 ``` **示例 2:** ```txt 输入:x = -123 输出:-321 ``` **示例 3:** ```txt 输入:x = 120 输出:21 ``` **示例 4:** ```txt 输入:x = 0 输出:0 ``` **提示:** * -231 <= x <= 231 - 1 ## 2 问题分析 1. **反转一个整数时**,我们**只需要拿到这个整数的末尾数字就可以了**,例如在反转 12345 时,先拿到 5,再拿到 4,之后是 3、4、1,我们按这样的顺序就可以反向拼接成一个数字了,也能达到反转的效果。 2. **拿末尾数字时**,**用取模运算就可以了**,例如拿 12345 的末尾数字: 1. 将 $ 12345 \% 10 $ 得到 5,之后将 $ 12345 / 10$。 2. 将 $ 1234 \% 10 $ 得到 4,之后将 $ 1234 / 10$。 3. 将 $ 123 \% 10 $ 得到 3,之后将 $ 123 / 10$。 4. 将 $ 12 \% 10 $ 得到 2,之后将 $ 12 / 10$。 5. 将 $ 1 \% 10 $ 得到 1,之后将 $ 1 / 10$。  3. 因为要**考虑负数**,**所以上述循环的判断条件是 $x != 0$**。 4. 同时因为【假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 `[−2^31, 2^31 − 1]`】,所以我们**不能用 `long` 存储最终结果**,而且**有些数字可能是合法范围内的数字**,但是**翻转过来就可能超过范围了**,例如 1147483649,本身是小于最大的 32 位整数 2147483647 的,但是将这个数字反转过来后就变成了 9463847411,这就比最大的 32 位整数还要大了,这样的数字没法存到 `int` 里,所以肯定要返回 0(溢出了),所以我们需要**在反转的过程中不断判断反转的临时结果 $res$ 是否溢出**,**如果溢出的话**,**直接返回 0**,具体判断规则如下: 1. $res > 214748364 || (res == 214748364 \&\& temp > 7)$,即 $res$ 大于最大的 32 位整数。 2. $res < -214748364 || (res == -214748364 \&\& temp < -8)$,即 $res$ 小于最小的 32 位整数。 > 注:$temp = x % 10$,即每次取的末尾数字。   ## 3 参考代码 ```java /** * 7. 整数反转 * @param x 要反转的整数 * @return 反转后的整数 */ public int reverse(int x) { int res = 0; while (x != 0) { // 每次取末尾数字 int temp = x % 10; // 判断是否大于最大 32 位整数 if ( res > 214748364 || (res == 214748364 && temp > 7)) {return 0;} // 判断是否小于最小 32 位整数 if (res < -214748364 || (res == 214748364 && temp < -8)) {return 0;} // 拼接结果 res = res * 10 + temp; // 修改要反转的整数 x /= 10; } return res; } ``` ## 参考文献 1. [7. 整数反转](https://leetcode-cn.com/problems/reverse-integer)。 2. [图解 7. 整数反转](https://leetcode-cn.com/problems/reverse-integer/solution/tu-jie-7-zheng-shu-fan-zhuan-by-wang_ni_ma)。
ricear
2022年6月17日 12:53
©
BY-NC-ND(4.0)
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
分享
链接
类型
密码
更新密码