这是我参与11月更文挑战的第17天,活动详情查看:2021最后一次更文挑战
前言
关于 LeetCode 数组类型题目的相关解法,可见LeetCode 数组类型题目做前必看,分类别解法总结了题目,可以用来单项提高。觉得有帮助的话,记得多多点赞关注哦,感谢!
题目描述
给你一个 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
链接:leetcode-cn.com/problems/re…
题解
-
转换为字符串。首先我们可以先用一个标记来记录数字的正负,然后统一将数字转换为正数,方便后续处理。
对于字符串的逆转,不管是转换为数组,利用数组内部的 reverse 函数,还是直接自己写 reverse 函数,都很方便处理。这里我才用了转换为数组,然后用数组的 reverse 函数逆转字符串,最后再转换为数字。
当然题目中规定了转换后数字的范围,超出范围返回 0,需要额外判断一下。
具体代码如下,时间复杂度 O(n)
/**
* @param {number} x
* @return {number}
*/
var reverse = function(x) {
const flag = x >= 0 ? 1 : -1
x = Math.abs(x)
const x_list = String(x).split('')
const new_x = Number(x_list.reverse().join('')) * flag
if (new_x > Math.pow(2, 31) - 1 || new_x < -Math.pow(2, 31)) {
return 0
}
return new_x
};
-
利用余数。对于一个数字,我们每除以 10,余下的就是最末尾的位置上的数字,所以,我们每次都对数字先取余数,得到末尾数字,然后除以 10,得到整数部分,直到数字为 0。这样我们就能拿到每个数位上的值,然后依次乘上 10,就能得到逆转后的数字。
具体代码如下,时间复杂度 O(n)。
/**
* @param {number} x
* @return {number}
*/
var reverse = function(x) {
const flag = x >= 0 ? 1 : -1
x = Math.abs(x)
let ans = 0
while (x != 0) {
ans = ans * 10 + (x % 10)
x = Math.floor(x / 10)
}
ans *= flag
if (ans > Math.pow(2, 31) - 1 || ans < -Math.pow(2, 31)) {
return 0
}
return ans
};