標籤:待字閨中 劍指offer 演算法 找工作 數字分析
題目來源:劍指offer之尋找醜數 與 待字閨中之序列產生分析
兩個題目其實是同一個問題,所有放在一起,算是總結一下,題目如下:
給定一個運算式2^i*2^j,其中i,j為非負整數。請找到一種方法,產生如下序列:
2^0 * 5^0 = 12^1 * 5^0 = 22^2 * 5^0 = 42^0 * 5^1 = 52^3 * 5^0 = 82^1 * 5^1 = 102^4 * 5^0 = 162^2 * 5^1 = 202^0 * 5^2 = 25.........
閱讀題目,要得到產生的數字序列是有序的,儘管題目中,並沒有明說。這個題目的方法,是比較多的。我們在這裡介紹幾個。
一個簡單的方法
很多同學,應該接觸過醜數那個題目吧?這個題目相比之下,還要簡單一些。i,j分別是2和5的指數, 則方法的過程如下:
i,j 從0開始,記錄較小的值作為序列的當前產生值。則i=j=0時,最小值為1,就是第一個元素;
兩個值都是最小元素,所以i和j,都自增1,在最小值1的基礎之上乘以2和5得到2,5, 取較小的2作為序列的值,即2,第二個;
此時,只對i進行變化,自增1,在其上一個值的基礎之上乘以2,即,2*2=4,再與5比較最小值。具體代碼如下:
vector<int> UglyNumber(int n){vector<int> ugly(n);ugly[0] = 1;int i2 = 0,i5 = 0,index;//i2和i5表示當前即將乘以2和5的下標for(index = 1;index < n;index++){int curUgly = min(ugly[i2]*2,ugly[i5]*5);ugly[index] = curUgly;while(ugly[i2] * 2 <= curUgly)i2++; //修改i2while(ugly[i5] * 5 <= curUgly)i5++; //修改i5}return ugly;}int main(){int n;while(cin >> n){vector<int> ugly = UglyNumber(n);for(int i = 0;i < n;i++)cout << ugly[i] << " ";cout << endl;}}