学习目标:
- 整数反转
leetcode原题链接
学习内容:
给你一个 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
提示:
- -2^31 <= x <= 2^31 - 1
解题思路1:
利用数组的reverse方法,首先判断是否为负数,如果为负数则记录下来并转换为不带符号的数字,然后转为数组再通过reverse方法反转后,变回数字,根据之前的负数记录选择是否乘-1,最后返回(注意判断一下边界值)。
代码如下:
/**
* @param {string} s
* @return {number}
*/
// 1.转数组,利用数组的reverse方法
var reverse = function (x) {
let result = 0, // 最后返回的数
Max = Math.pow(2, 31), // 最大边界值
str = x + '',
minus = false; // 是否是负数
let arr = str.split('')
if (arr[0] === '-') {
minus = true
arr.splice(0, 1)
}
arr.reverse()
str = arr.join('')
result = minus ? +str * -1 : +str // 判断是否是负数,是就转成数字后乘-1
return result > Max || result < Max * -1 ? 0 : result
};
解题思路2:
利用双指针的做法,前面的步骤与思路1类似,都是转换为数组,之后判断数组长度是否是奇数,如果是,单独保存一下中间的数,然后把中间值从数组中剔除,之后设置左指针为数组第一项,右指针为数组最后一项,不断让两个指针指向的值进行交互,直到左指针不小于右指针为止。然后再在之前删除中间值的位置吧中间值加回去,再变回数字,剩下的步骤与思路1一致,不再赘述。
var reverse = function (x) {
if (x === 0) return x
let minus = false
let arr = [];
if (x < 0) {
minus = true
arr = (x * -1 + '').split('')
} else {
arr = (x + '').split('')
}
let result
let middleIndex = -1,
middle
if (arr.length % 2 !== 0) { // 说明长度是奇数
middleIndex = Math.floor(arr.length / 2) // 取中间值的index
middle = arr[middleIndex] // 保存中间值
arr.splice(middleIndex, 1)
}
let left = 0;
let len = arr.length;
let right = len - 1;
while (left < right) {
let temp = arr[right]
arr[right] = arr[left]
arr[left] = temp
left++
right--
}
if (middle) {
arr.splice(middleIndex, 0, middle) // 将中间值加回数组的中间位置
}
result = +arr.join('')
if (minus) {
result *= -1
}
return result > Math.pow(2, 31) || result < Math.pow(2, 31) * -1 ? 0 : result
}
标签:arr,reverse,反转,JS,算法,let,result,数组,minus
From: https://blog.csdn.net/weixin_45231569/article/details/139900053