LeetCode演算法題-Ugly Number(Java實現-四種解法)
這是悅樂書的第199次更新,第208篇原創
01 看題和準備
今天介紹的是LeetCode演算法題中Easy級別的第64題(順位題號是263)。編寫一個程式來檢查給定的數字是否是一個醜陋的數字。醜陋的數字是正數,其主要因子僅包括2,3,5。例如:
輸入:6
輸出:true
說明:6 = 2×3
輸入:8
輸出:true
說明:8 = 2×2×2
輸入:14
輸出:false
說明:14並不醜陋,因為它包含另一個因子7。
注意:
1通常被視為醜陋的數字。
輸入在32位有符號整數範圍內:[ -2^31, 2^31 - 1]。
本次解題使用的開發工具是eclipse,jdk使用的版本是1.8,環境是win7 64位系統,使用Java語言編寫和測試。
02 第一種解法
特殊情況:1是醜陋數字,小於等於0的不是醜陋數字。
正常情況:num如果是醜陋數字,可以分為兩種情況:一是單純的某一因子的冪次方,二是三個因子的隨機排列組合,可能兩個一起出現,也有可能三個一起出現。除以這三個因子中的一個,最後商是1,則說明這個數是醜陋數字;除以這三個因子中的兩個或三個,最後商是1,那麼這個數也是醜陋數字。
對此,使用兩層迴圈,外層迴圈控制因子,從2開始,一直到5,中間有個4其實就是2的平方,也可以算作其中的一個因子,內層迴圈先判斷對當前因子取餘是否等於0,如果不等於0則說明可能是另外的因子的積,也有可能不是醜陋數字,如果等於0,則除以當前因子獲取商,重新賦值給num,繼續判斷和迴圈。
public boolean isUgly(int num) {
if (num > 0) {
for (int i = 2; i < 6; i++) {
while (num % i == 0) {
num /= i;
}
}
}
return num == 1;
}
03 第二種解法
將2,3,5這三個因子放入陣列,使用兩層迴圈,外層依次取出陣列中的因子,內層做取餘判斷和求商,前提條件是num大於0。
public boolean isUgly2(int num) { if (num > 0) { int[] arr = {2, 3, 5}; for (int d : arr) { while (num % d == 0) { num /= d; } } } return num == 1; }
04 第三種解法
也可以分開來計算商,使用3個迴圈分開判斷取餘和求商,最後判斷num等不等於1。
public boolean isUgly3(int num) {
if (num > 0) {
while (num % 2 == 0) {
num /= 2;
}
while (num % 3 == 0) {
num /= 3;
}
while (num % 5 == 0) {
num /= 5;
}
}
return num == 1;
}
05 第四種解法
使用遞迴的解法,判斷邏輯和上面兩種解法一樣,對2取餘等於0的話,除以2後繼續呼叫自身,對於3和5,情況一樣,最後判斷是否等於1。
public boolean isUgly4(int num) {
if (num <= 0) {
return false;
}
if (num % 2 == 0) {
return isUgly4(num/=2);
}
if (num % 3 == 0) {
return isUgly4(num/=3);
}
if (num % 5 == 0) {
return isUgly4(num/=5);
}
return num == 1;
}
06 小結
演算法專題目前已連續日更超過一個月,演算法題文章64+篇,公眾號對話方塊回覆【資料結構與演算法】、【演算法】、【資料結構】中的任一關鍵詞,獲取系列文章合集。
以上就是全部內容,如果大家有什麼好的解法思路、建議或者其他問題,可以下方留言交流,點贊、留言、轉發就是對我最大的回報和支援!