翻轉(zhuǎn)整數(shù)
要求
給出一個 32 位的有符號整數(shù),你需要將這個整數(shù)中每位上的數(shù)字進行反轉(zhuǎn)。
輸入: 123
輸出: 321
注意:
假設(shè)我們的環(huán)境只能存儲得下 32 位的有符號整數(shù),則其數(shù)值范圍為 [?231, 231 ? 1]。請根據(jù)這個假設(shè),如果反轉(zhuǎn)后整數(shù)溢出那么就返回 0。
解題思路如下
注意:
我們借鑒歐幾里得求最大公約數(shù)的方法來解題。符號的處理邏輯同方法一,這里我們通過模 10 取 到最低位,然后又通過乘 10 將最低位迭代到最高位,完成翻轉(zhuǎn)。
詳解如下
詳解
1. 設(shè)置邊界極值;
2. 取給定數(shù)值的絕對值,遍歷循環(huán)生成每一位數(shù)字,借鑒歐幾里得算法,從 num 的最后一位開
始取值拼成新的數(shù)
3. 同步剔除掉被消費的部分
4. 如果最終結(jié)果為異常值,則直接返回 0;如果原本數(shù)據(jù)為負(fù)數(shù),則對最終結(jié)果取反
5. 返回最終結(jié)
代碼如下
function reverse(x){
// 獲取相應(yīng)數(shù)的絕對值
let rever = Math.abs(x);
//極值
const MAX = 2147483647;
const MIN = -2147483648;
let nums = 0;
while(rever !== 0){
// 借鑒歐幾里得算法,從 nums 的最后一位開始取值拼成新的數(shù)
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;
}
復(fù)雜度分析:
- 時間復(fù)雜度: O(n)
代碼中使用for循環(huán),次數(shù)為 n,即整數(shù)的長度,因此時間復(fù)雜度為 O(n)。 - 空間復(fù)雜度: O(1)
算法中只用到常數(shù)個變量,因此空間復(fù)雜度為 O(1)。
本文提供更多的面試算法題解,有利于各位看官,快速理解,更多了解,現(xiàn)在被問到頻率最高的算法題。
如果你覺得可以請掃描我的公眾號
第一時間推送,洲洲