這是悅樂(lè)書(shū)的第199次更新喇颁,第208篇原創(chuàng)
01 看題和準(zhǔn)備
今天介紹的是LeetCode算法題中Easy級(jí)別的第64題(順位題號(hào)是263)。編寫(xiě)一個(gè)程序來(lái)檢查給定的數(shù)字是否是一個(gè)丑陋的數(shù)字。丑陋的數(shù)字是正數(shù),其主要因子僅包括2,3,5。例如:
輸入:6
輸出:true
說(shuō)明:6 = 2×3
輸入:8
輸出:true
說(shuō)明:8 = 2×2×2
輸入:14
輸出:false
說(shuō)明:14并不丑陋扭勉,因?yàn)樗硪粋€(gè)因子7。
注意:
1通常被視為丑陋的數(shù)字苛聘。
輸入在32位有符號(hào)整數(shù)范圍內(nèi):[ -2^31涂炎, 2^31 - 1]。
本次解題使用的開(kāi)發(fā)工具是eclipse设哗,jdk使用的版本是1.8唱捣,環(huán)境是win7 64位系統(tǒng),使用Java語(yǔ)言編寫(xiě)和測(cè)試网梢。
02 第一種解法
特殊情況:1是丑陋數(shù)字震缭,小于等于0的不是丑陋數(shù)字。
正常情況:num如果是丑陋數(shù)字澎粟,可以分為兩種情況:一是單純的某一因子的冪次方,二是三個(gè)因子的隨機(jī)排列組合欢瞪,可能兩個(gè)一起出現(xiàn)活烙,也有可能三個(gè)一起出現(xiàn)。除以這三個(gè)因子中的一個(gè)遣鼓,最后商是1啸盏,則說(shuō)明這個(gè)數(shù)是丑陋數(shù)字;除以這三個(gè)因子中的兩個(gè)或三個(gè)骑祟,最后商是1回懦,那么這個(gè)數(shù)也是丑陋數(shù)字气笙。
對(duì)此,使用兩層循環(huán)怯晕,外層循環(huán)控制因子潜圃,從2開(kāi)始,一直到5舟茶,中間有個(gè)4其實(shí)就是2的平方谭期,也可以算作其中的一個(gè)因子,內(nèi)層循環(huán)先判斷對(duì)當(dāng)前因子取余是否等于0吧凉,如果不等于0則說(shuō)明可能是另外的因子的積隧出,也有可能不是丑陋數(shù)字,如果等于0阀捅,則除以當(dāng)前因子獲取商胀瞪,重新賦值給num,繼續(xù)判斷和循環(huán)饲鄙。
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這三個(gè)因子放入數(shù)組凄诞,使用兩層循環(huán),外層依次取出數(shù)組中的因子傍妒,內(nèi)層做取余判斷和求商幔摸,前提條件是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 第三種解法
也可以分開(kāi)來(lái)計(jì)算商颤练,使用3個(gè)循環(huán)分開(kāi)判斷取余和求商既忆,最后判斷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 第四種解法
使用遞歸的解法嗦玖,判斷邏輯和上面兩種解法一樣患雇,對(duì)2取余等于0的話,除以2后繼續(xù)調(diào)用自身宇挫,對(duì)于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 小結(jié)
算法專題目前已連續(xù)日更超過(guò)一個(gè)月翠储,算法題文章64+篇,公眾號(hào)對(duì)話框回復(fù)【數(shù)據(jù)結(jié)構(gòu)與算法】橡疼、【算法】援所、【數(shù)據(jù)結(jié)構(gòu)】中的任一關(guān)鍵詞,獲取系列文章合集欣除。
以上就是全部?jī)?nèi)容住拭,如果大家有什么好的解法思路、建議或者其他問(wèn)題,可以下方留言交流滔岳,點(diǎn)贊杠娱、留言、轉(zhuǎn)發(fā)就是對(duì)我最大的回報(bào)和支持谱煤!