7. 整数反转
描述
- 给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
示例 1
输入: 123
输出: 321
示例 2
输入: -123
输出: -321
示例 3
输入: 120
输出: 21
思路 1
- 将非符号部分进行翻转,最后补充符号
详解 1
- 1.首先设置边界极值;
- 2.使用字符串的翻转函数进行主逻辑;
- 3.补充符号
- 4.然后拼接最终结果
解法 1
/**
* @param {number} x
* @return {number}
*/
var reverse = function(x) {
if( typeof x !== 'number') return;
const MAX = 2147483647;
const MIN = -2147483648;
let y = x > 0 ?
x.toString().split('').reverse().join('') :
x.toString().slice(1).split('').reverse().join('');
let res = x > 0 ? parsetInt(y , 10) : 0 - parseInt(y, 10)
if(res > MIN && res < MAX ){
return res;
}
return 0;
};
复杂度分析 1
时间复杂度:O(n)
- 代码中 reverse 函数时间复杂度为 , 为整数长度,因此时间复杂度为 ,考虑到32位整数最大长度为 11,即 -2147483648,也可认为是常数时间复杂度 。
空间复杂度:O(n)
- 代码中创建临时 String 对象, 为整数长度,因此空间复杂度为 ,考虑到32位整数最大长度为11,即-2147483648,因此空间复杂度为 。
思路 2
- 借鉴欧几里得求最大公约数的方法来解题。符号的处理逻辑同方法一,这里我们通过模 10 取到最低位,然后又通过乘 10 将最低位迭代到最高位,完成翻转。
详解 2
- 1.设置边界极值;
- 2.取给定数值的绝对值,遍历循环生成每一位数字,借鉴欧几里得算法,从 num 的最后一位开始取值拼成新的数
- 3.步剔除掉被消费的部分
- 4.如果最终结果为异常值,则直接返回 0;如果原本数据为负数,则对最终结果取反
- 5.返回最终结果
代码
/**
* @param {number} x
* @return {number}
*/
const reverse = (x) => {
let int = Math.abs(x);
const MAX = 2147483647;
const MIN = -2147483648;
let num = 0;
while(int !== 0 ){
num = int % 10 + num * 10;
int = Math.floor(int / 10)
}
if( int < MIN || int > MAX){
return 0;
}
if(x < 0 ){
return -1 * num;
}
return num;
};