劍指offer面試題34

2021-06-22 10:14:17 字數 1431 閱讀 2266

面試題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個醜數。思路 給乙個陣列存放當前已有的醜數,這些醜數都是按順序存放的,每次計算新的醜數時,...