LeetCode 07 整数反转
给你一个 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
提示:
-231 <= x <= 231 - 1
解题思路
1. 字符串/数组反转
正常情况下,想到反转,就会想到将数字变为字符串/数组,然后将字符串/数组进行反转之后,再进行拼接。这种情况下就仅需要考虑前面的符号位和对应的超出数量位数的限制
- 设置一个数字是否是正数的标志位,如果为正数设置为true,如果为负数,将标志位置为false,并将数字取反
- 将数字split成数组,然后reverse,拼接后转为number
- 如果正数标志为false,那么将数字再取反
- 如果数字在[-2^32, 2^32 - 1]即([-2147483648, 2147483647])范围之外的话,那么直接置为0
2. 数学法反转
上面的方法,在某些编程语言中性能并不是很高,导致最后的消耗时长比较多,那么可以使用数学方式将数字反转。首先使用取模方式将数字按位弹出,然后将结果数字 * 10再加上弹出的数字变为新的数字,这样越在原数字后面的数字,在结果数字中就越在前面,这样就完成了数字反转
- 设置一个数字是否是正数的标志位,如果为正数设置为true,如果为负数,将标志位置为false,并将数字取反
- 数字 x % 10 ,获取到了数字x的最后一位是什么,记为d
- 数字 x = Math.floor(x / 10) ,这样数字x就将最后一位弹出了
- 结果 result * 10 + d,这样结果数字就变成了越先进来的数字位数越高,初始result为0
- 如果 标志位为false,那么将结果取反
- 如果数字在[-2^32, 2^32 - 1]即([-2147483648, 2147483647])范围之外的话,那么直接置为0
代码
var reverse = function(x) { |
步骤演示
示例1: 123
- 123 % 10 = 3,得到最后一位是3
- Math.floor(123 / 10) = 12,原x变为12
- result * 10 + 3 = 3,result初始值为0
- 12 % 10 = 2,得到最后一位是2
- Math.floor(12 / 10) = 1,原x变为1
- result * 10 + 2 = 32
- 1 % 10 = 1,得到最后一位为1
- Math.floor(1 / 10) = 0,原x为0
- result * 10 + 1 = 321
- x已经等于0了,停止循环
那么result为321
示例2: -123
- x 小于 0 ,那么标志位置为false,将x取反为123
- 同上
- 因为标志位为false,需要将result取反,为-321
示例3: 120
- 120 % 10 = 0,得到最后一位为0
- Math.floor(120 / 10) = 12,原x变为12
- result * 10 + 0 = 0,result从0开始
- 12 % 10 = 2,得到最后一位是2
- Math.floor(12 / 10) = 1,原x变为1
- result * 10 + 2 = 2,
- 1 % 10 = 1, 得到最后一位是1
- Math.floor(1 / 10) = 0,原x变为0
- result * 10 + 1 = 21
- x已经等于0了,停止循环
那么result为21