Appearance
7. 整数反转
解法一:逆序输出
- 整数转换成字符串,字符串转换成数组
- 创建新数组,旧数组逆序遍历push进新数组
- 将新的数组转换成字符串,字符串转换成数组
- 空间复杂度O(n),时间复杂度O(n)
注意:
- 数字如果超出范围,要返回0
- 符号处理:正负数都当正数处理
js
/**
* @param {number} x
* @return {number}
*/
var reverse = function(x) {
// 获取符号
const sign = Math.sign(x);
// 都用正数处理
x = Math.abs(x);
// 将整数转换字符串再转换成数组
const arr = x.toString().split('');
// 定义一个新数组
const result = [];
// 逆序遍历
for(let i = arr.length - 1; i >= 0; i--) {
result.push(arr[i])
}
// 将数组转换字符串再转换成整数
x = result.join('') * sign;
// 判断是否溢出,溢出返回0
if (x >= Math.pow(2, 31) - 1 || x <= (-1) * Math.pow(2, 31)) return 0;
// 将转换后的整数返回
return x;
};
TIP
反转数组可以用系统函数reverse,这样是对当前数组进行反转,不用创建新数组了
js
/**
* @param {number} x
* @return {number}
*/
var reverse = function(x) {
const sign = Math.sign(x);
x = Math.abs(x);
// 将整数转换字符串再转换成数组并反转
const arr = x.toString().split('').reverse();
// 将数组转换字符串再转换成整数
x = arr.join('') * sign;
if (x >= Math.pow(2, 31) - 1 || x <= (-1) * Math.pow(2, 31)) return 0;
return x;
};
TIP
涉及js知识点:
- 存储符号:Math.sign(x)
- 获取绝对值:Math.abs(x)
- 整数转换成字符串:x.toString()
- 字符串转换成数组:x.split('')
- 数组转换成字符串:arr.join('')
- 字符串转换成整数:隐式转换 乘、除即可
- 反向遍历:for循环反向遍历,reverse()返回原数组
- 整数范围:(-1) * Math.pow(2, 31) ---> Math.pow(2, 31) - 1
解法二:首尾交换
- 整数转换成字符串,字符串转换成数组
- 数组首(start)尾(end)索引在的元素交换,循环结束条件是start >= end
- 将换好的数组转换成字符串,字符串转换成数组
- 空间复杂度O(n),时间复杂度O(n)
注意:
- 数字如果超出范围,要返回0
- 符号处理:正负数都当正数处理
js
/**
* @param {number} x
* @return {number}
*/
var reverse = function(x) {
// 获取符号
const sign = Math.sign(x);
// 都用正数处理
x = Math.abs(x);
// 整数转换成字符串转换成数组
const arr = x.toString().split('');
// 定义两个索引指向数组头部和尾部
let start = 0;
let end = arr.length - 1;
// 循环中,如果start > end说明数组是偶数, start = end 说明数组是奇数
while(start < end) {
// 交换元素
let temp = arr[start];
arr[start] = arr[end];
arr[end] = temp;
// 两遍索引向中间靠拢
start++;
end--;
}
// 将数组转换成字符串转换成整数
x = arr.join('') * sign;
// 判断是否溢出,溢出返回0
if (x >= Math.pow(2, 31) - 1 || x <= (-1) * Math.pow(2, 31)) return 0;
// 将转换后的整数返回
return x;
};
TIP
交换数组两个元素的方式,在ES6中可以用[a,b] = [b,a]来做
js
/**
* @param {number} x
* @return {number}
*/
var reverse = function(x) {
// 获取符号
const sign = Math.sign(x);
// 都用正数处理
x = Math.abs(x);
// 整数转换成字符串转换成数组
const arr = x.toString().split('');
// 定义两个索引指向数组头部和尾部
let start = 0;
let end = arr.length - 1;
// 循环中,如果start > end说明数组是偶数, start = end 说明数组是奇数
while(start < end) {
// 交换元素
[arr[start], arr[end]] = [arr[end], arr[start]];
// 两遍索引向中间靠拢
start++;
end--;
}
// 将数组转换成字符串转换成整数
x = arr.join('') * sign;
// 判断是否溢出,溢出返回0
if (x >= Math.pow(2, 31) - 1 || x <= (-1) * Math.pow(2, 31)) return 0;
// 将转换后的整数返回
return x;
};
TIP
涉及js知识点:
- 存储符号:Math.sign(x)
- 获取绝对值:Math.abs(x)
- 整数转换成字符串:x.toString()
- 字符串转换成数组:x.split('')
- 数组转换成字符串:arr.join('')
- 字符串转换成整数:隐式转换 乘、除即可
- 首尾指针循环结束的条件,start >= end, start > end是偶数数组,start = end是奇数数组
- 数组两个元素交换方法:[a,b] = [b,a] ; temp = a, a=b, b=temp;
- 整数范围:(-1) * Math.pow(2, 31) ---> Math.pow(2, 31) - 1
解法三:数学运算
x % 10
----> 个位数字- 每一位数组变成个位数字
- 每一位数字计算累加
js
/**
* @param {number} x
* @return {number}
*/
var reverse = function(x) {
// 获取符号
const sign = Math.sign(x);
// 都用正数处理
x = Math.abs(x);
let result = 0;
// 循环到x为0结束
while(x !== 0) {
// 获取个位数字
let num = x % 10;
// 在原有基础上累加
result = result * 10 + num;
// x去掉个位数字
x = Math.floor(x / 10);
}
// 获取符号
result = result * sign;
// 判断是否溢出,溢出返回0
if (result >= Math.pow(2, 31) - 1 || result <= (-1) * Math.pow(2, 31)) return 0;
// 将转换后的整数返回
return result;
};
TIP
ES6中,Math.pow
可以写成 **