面試題34:醜數
題目:我們把只包含因子2、3和5的數稱為醜數(ugly number)。求按從下到大的順序的第1500個醜數。例如6,8都是醜數,當時14不是,因為它包含了因子7。習慣上我們把1當做第乙個醜數。
預備知識:
為了優化時間效能,通常可以利用「以空間換取時間」。
其餘%,0%2 也是0.
思路:第一種思路:因為醜數可以被2,3,5整除,因此判斷乙個數是不是醜數,可以讓他一直分別除2,3,5,直到最後為1.
這裡有兩種實現:
迴圈:
//判斷乙個數是否為醜數
bool isugly1(int number)
遞迴:
//判斷數 number是否為醜數,遞迴實現
bool isugly2(int number)
if (number % 3 == 0 )
if ( number % 5 == 0)
}return flag;
}
但是這種每次判斷乙個數是不是醜數的效率很低!!
第二種思路:可以先建立乙個陣列,把得到的醜數儲存起來,併排好序,顯然後面的醜數必然是前面的醜數乘以2,3,或5得到的。
演算法實現:
// 面試題34.cpp : 定義控制台應用程式的入口點。
//#include "stdafx.h"
#include //醜數
//判斷乙個數是否為醜數
bool isugly1(int number)
int getuglynumber_solution1(int index)
} return number;
}//求3個數中的最小值
int min(int number1, int number2, int number3)
int getuglynumber_solution2(int index)
int ugly = puglynumbers[nextuglyindex - 1];
delete puglynumbers;
return ugly;
}//判斷數 number是否為醜數,遞迴實現
bool isugly2(int number)
if (number % 3 == 0 )
if ( number % 5 == 0)
}return flag;
}int getuglynumber_solution3(int index) }
return number;
}//*****************測試******************
void test1()
int _tmain(int argc, _tchar* argv)
劍指Offer 面試題34 醜數
我們把只包含因子2 3和5的數成為醜數,求按從小到大的順序的第1500個醜數。例如6 8都是醜數,但14不是,因為它包含因子7。習慣上我們把1當做第乙個醜數。分析 逐個判斷整數是不是醜數,直觀但是效率低下。根據醜數的定義,醜數只能被2 3和5整除,也就是說乙個數能被2整除,我們把它連續除以2 如果能...
劍指offer面試題 34 醜數
題目描述 把只包含因子2 3和5的數稱作醜數 ugly number 例如6 8都是醜數,但14不是,因為它包含因子7。習慣上我們把1當做是第乙個醜數。求按從小到大的順序的第n個醜數。思路分析 思路一 逐個判斷每個整數是不是醜數的解法,直觀但不高效 牛客網測試超時 所謂乙個數m是另乙個數n的因子,是...
劍指offer 面試題34 醜數
劍指offer 面試題34 醜數 題目 把只包含質因子2 3和5的數稱作醜數 ugly number 例如6 8都是醜數,但14不是,因為它包含質因子7。習慣上我們把1當做是第乙個醜數。求按從小到大的順序的第n個醜數。思路 給乙個陣列存放當前已有的醜數,這些醜數都是按順序存放的,每次計算新的醜數時,...