翻转整数(2)
2020-07-02 本文已影响0人
洲洲哥
翻转整数
要求
给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
输入: 123
输出: 321
注意:
假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−231, 231 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。
解题思路如下
注意:
我们借鉴欧几里得求最大公约数的方法来解题。符号的处理逻辑同方法一,这里我们通过模 10 取 到最低位,然后又通过乘 10 将最低位迭代到最高位,完成翻转。
详解如下
详解
1. 设置边界极值;
2. 取给定数值的绝对值,遍历循环生成每一位数字,借鉴欧几里得算法,从 num 的最后一位开
始取值拼成新的数
3. 同步剔除掉被消费的部分
4. 如果最终结果为异常值,则直接返回 0;如果原本数据为负数,则对最终结果取反
5. 返回最终结
代码如下
function reverse(x){
// 获取相应数的绝对值
let rever = Math.abs(x);
//极值
const MAX = 2147483647;
const MIN = -2147483648;
let nums = 0;
while(rever !== 0){
// 借鉴欧几里得算法,从 nums 的最后一位开始取值拼成新的数
mods = rever % 10;
nums = mods + nums * 10;
// 剔除掉被消费的部分
rever = Math.floor(rever / 10)
}
// 异常值
if (nums >= MAX || nums <= MIN) {
return 0;
}
if (x < 0) {
return nums * -1;
}
return nums;
}
复杂度分析:
- 时间复杂度: O(n)
代码中使用for循环,次数为 n,即整数的长度,因此时间复杂度为 O(n)。 - 空间复杂度: O(1)
算法中只用到常数个变量,因此空间复杂度为 O(1)。
本文提供更多的面试算法题解,有利于各位看官,快速理解,更多了解,现在被问到频率最高的算法题。