LeetCode系列记录我学习算法的过程。
持续创作,加速成长!这是我参与「掘金日新计划 6 月更文挑战」的第 7 天,点击查看活动详情
题目
给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。
如果反转后整数超过 32 位的有符号整数的范围 [, − 1] ,就返回 0。
假设环境不允许存储 64 位整数(有符号或无符号)。
示例:
输入: x = 123
输出: 321
输入: x = -123
输出: -321
输入: x = 120
输出: 21
输入: x = 0
输出: 0
提示
- <= x <= - 1
思路
这个题目我的思路就是将数组变成去掉符号的字符串
然后将字符串进行切割 反转数组 再组合成字符串并拼接上符号
最后转成数字,判断是否在 指定范围内,将结果返回
代码实现
/**
* @param {number} x
* @return {number}
*/
var reverse = function(x) {
// 如果 x 只有一位数,直接返回自身
if (x > -10 && x < 10) return x
// 记录符号
let symbol = x > 0 ? '' : '-'
// 将 x 转成字符串 然后切割 反转 合并 再与符号组合
let str = symbol + (String(Math.abs(x)).split('').reverse().join(''))
// 将上面得到的反转字符串转为数字
let num = Number(str)
// 判断大小 返回 0 或自身
return (num < Math.pow(-2, 31) || num > (Math.pow(2, 31) - 1)) ? 0 : num
};
完美运行通过~
优化
这题我确实没想到有其他啥更好的方法,只能再看看别人是怎么实现的
果然有人的解法是我完全没想到且乍一看还看不懂的那种,使用了按位或 | 来进行保留符号取整:
result * 10 + x % 10取出末位x % 10(负数结果还是负数,无需关心正负),拼接到result中。x / 10去除末位,| 0强制转换为32位有符号整数。- 通过
| 0取整,无论正负,只移除小数点部分(正数向下取整,负数向上取整)。 - result
| 0超过32位的整数转换结果不等于自身,可用作溢出判断。
/**
* @param {number} x
* @return {number}
*/
var reverse = function(x) {
// 记录结果
let result = 0
while(x !== 0) {
// 将 x 的个位拼到 result 的个位上
result = result * 10 + x % 10
// 去掉 x 的个位 及 小数
x = (x / 10) | 0
}
// 通过 | 0 操作可以判断结果是否在 指定范围内
return (result | 0) === result ? result : 0
};