# 题目描述
给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
示例一🌰:
输入: 123
输出: 321
示例二🌰:
输入: -123
输出: -321
示例三🌰:
输入: 1200
输出: 21
注意⚠️
假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−2^31, 2^31 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。
# 解题思路
解法一
将输入的数转换为数组, 然后利用数组的reverse()
方法反转,之后在判断反转后数的大小.
- 考虑输入的数为0, 或者小于10的情况;
- 若是输入的数为负数,则注意要将
-
号取出再进行反转; - 反转完之后记得去除反转后的数前面有
0
的项; - 反转完之后记得要将负号添加回去;
- 可以利用
Math.pow()
来进行数的判断.
解法二
将输入的数从尾部开始向头部移.
- 利用
x % 10
来获取一串数字中的个位数; - 利用
parseInt(x / 10)
来获取一串数字中除了个位数的其它位数;
# Coding
解法一
/**
* @param {number} x
* @return {number}
*/
var reverse = function(x) {
if (!x) return 0;
x += '' // 将数字转为字符串
let array = x.split('')
let isNegative = false // 是否为负数
if (array.length === 1) return Number(array.join(''))
if (array[0] === '-') { // 或者 x < 0
isNegative = true
array.shift() // 去掉'-'号
}
array = array.reverse()
while (array[0] === '0') { // 去除反转后前面的0
array.shift()
}
if (isNegative) array.unshift('-')
x = Number(array.join(''))
if (x >= Math.pow(-2, 31) && x <= Math.pow(2, 31) - 1) {
return x
} else {
return 0
}
};
执行用时88 ms,内存消耗35.8MB
解法二
/**
* @param {number} x
* @return {number}
*/
var reverse = function (x) {
let overflow = function (x) {
return (x >= Math.pow(2, 31) - 1 || x <= -Math.pow(2, 31)) ? 0 : x
}
x = overflow(x)
let isNegative = x < 0
if (isNegative) {
x = -x
}
let a = 0
while (x > 9) {
a = a * 10 + x % 10 * 10
x = parseInt(x / 10)
}
a += x
return isNegative ? overflow(-a) : overflow(a)
};
执行用时88 ms,内存消耗35.4MB
测试代码
reverse(120)
// 21
reverse(248392835803854735943854)
// 0
阅读全文