LeetCode第七題
題目描述:
給出一個 32 位的有符號整數(shù),你需要將這個整數(shù)中每位上的數(shù)字進行反轉(zhuǎn)。
示例 1:
輸入: 123
輸出: 321
示例 2:
輸入: -123
輸出: -321
示例 3:
輸入: 120
輸出: 21
注意:
假設(shè)我們的環(huán)境只能存儲得下 32 位的有符號整數(shù),則其數(shù)值范圍為 [?231, 231 ? 1]。請根據(jù)這個假設(shè),如果反轉(zhuǎn)后整數(shù)溢出那么就返回 0。
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/reverse-integer
思路
采用除以10和取余操作,獲取反轉(zhuǎn)的數(shù)字。為了使程序過程更清晰,創(chuàng)建一個數(shù)組,用來存儲反轉(zhuǎn)數(shù)的每位數(shù)值。再循環(huán)乘以基的各次方累加,就得到了目標(biāo)值。最后將得到的值與int型最大最小值比較,若溢出則將目標(biāo)值置0。然后返回目標(biāo)值即可。
源代碼
int reverse(int x){
int nums[11] = {0}; //32位有符號整數(shù)化為十進制不超過11位,此數(shù)組存儲反轉(zhuǎn)數(shù)的每位數(shù)值
const int mod = 10; //將模10定義為const類型
int num = x; //num為每次遍歷剩下未處理的數(shù)
int i = 0,j = 0;
double result = 0; //結(jié)果值定義為double型,防止值溢出int型而報錯
while(num != 0){
nums[i] = num % mod;
num /= mod;
++i;
}
double sub = 1; //以10為基,防止值溢出int型而報錯
if(i > 0){
for(j = i - 1,sub = 1;j >= 0;--j,sub *= mod){
result += nums[j] * sub;
}
}
if(result > 2147483647 || result < (-2147483648)){
result = 0;
}
return result;
}
分析
時間復(fù)雜度為線性級別,空間復(fù)雜度為常數(shù)級別。
然而數(shù)組的創(chuàng)建不是必須的,可以在while循環(huán)內(nèi)部就將result累加起來。這樣代碼會更加簡潔。