题目
题目链接:leetcode-cn.com/leetbook/re…
题解
1、转换成字符数组后再反转
要实现整数的反转,可能一下并不知道怎么实现,但是我们知道怎么实现数组的反转,于是可以按以下步骤实现整数反转:
- 将整数转换成字符串;
- 将字符串的每一位切割放到一个数组中;
- 对数组进行反转;(通过数组反转实现字符串反转)
- 将数组合并成字符串;(使用 maxStr 和 minStr 对合并后的字符串检查)
- 将字符串转换成数字;
但是根据题目给出的条件:计算机只能存储 32 位有符号整数,当反转后的数字超过了存储范围时返回 0 ; 于是我们要在倒数第二步对字符串进行检测,判断字符串对应的整数其是否超出可存储范围;
/**
* @param {number} x
* @return {number}
*/
var reverse = function(x) {
let str = String(x);
let arr = str.split('');
let isMinus = false;
// maxStr 和 minStr 用来限制如果数字反转后超过两者后输出 0 ;
let maxStr = (Math.pow(2,31) - 1).toString();
let minStr = (0 - Math.pow(2,31)).toString();
if('-' === arr[0]) {
arr.shift();
isMinus = true;
}
// 交换数组
let head = 0,
rear = arr.length - 1;
while(head < rear) {
arr[head] -= arr[rear];
arr[rear] = Number(arr[rear]) + arr[head];
arr[head] = arr[rear] - arr[head];
head++;
rear--;
}
//
if(isMinus) {
arr.unshift('-');
str = arr.join('');
if(str.length === minStr.length && str > minStr) {
return 0 ;
}
return Number(str);
}else{
str = arr.join('');
if(str.length === maxStr.length && str > maxStr){
return 0;
}
return Number(str);
}
};
2、进一步思考
如果没有 环境不允许存储 64 位整数 这个限制,那么可以直接在数值上进行反转,不用转换为数组;
/**
* @param {number} x
* @return {number}
*/
var reverse = function(x) {
let num = Math.abs(x),
result = 0;
const MAX_VALUE = Math.pow(2,31) - 1,
MIN_VALUE = 0 - Math.pow(2,31)
while(0 !== num) {
result = result * 10 + num % 10;
num = ( num / 10) | 0;
}
if(x < 0) {
result = (0 - result);
}
if(result > MAX_VALUE || result < MIN_VALUE) {
return 0;
}
return result;
};
大家如果有更好的思路和解法,欢迎大家一起来讨论啊~
这是使用 JavaScript 对 LeetCode《初级算法》的每道题的总结和实现的其中一篇,汇总篇在这里: