整数反转
给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。
如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1] ,就返回 0。
假设环境不允许存储 64 位整数(有符号或无符号)。
示例 1:
输入: x = 123
输出: 321
示例 2:
输入: x = 120
输出: 21
提示:
-231 <= x <= 231 - 1
解题思路
感觉这题应该算归类为简单题,首先肯定是通过切割反转API来处理,然后处理临界值问题。后来实现后,觉得太粗暴了,然后又学了取余法
- 切割反转法
- 取余法
切割反转法解题代码
/**
* @param {number} x
* @return {number}
*/
var reverse = function (x) {
const absResult = Math.abs(x);
let result = absResult.toString().split("").reverse().join("");
if (x < 0) {
if (-result < -Math.pow(2, 31)) {
result = 0;
} else {
result = -result;
}
return result;
}
if (result > Math.pow(2, 31) - 1) {
return 0;
}
return result;
};
优化代码
/**
* @param {number} x
* @return {number}
*/
var reverse = function (x) {
const absResult = Math.abs(x);
let result = absResult.toString().split("").reverse().join("");
if (x < 0) {
result = -result;
}
result =
result > Math.pow(2, 31) - 1 || result < -Math.pow(2, 31) ? 0 : result;
return result;
};
取余法代码
/**
* @param {number} x
* @return {number}
*/
var reverse = function (x) {
let absResult = Math.abs(x);
let result = 0;
while (absResult > 0) {
// 每进一位就乘以10然后加上余数
result = result * 10 + (absResult % 10);
// 取余结束后,去掉一位
absResult = Math.floor(absResult / 10);
}
if (x < 0) {
result = -result;
}
result =
result > Math.pow(2, 31) - 1 || result < -Math.pow(2, 31) ? 0 : result;
return result;
};