编程题:“丑数”
今天看劍指offer的時候碰到了“丑數”這個問題,說這個“丑數”,常規的情況是,一般人碰到這個問題會感覺到無從下手,為什么呢?因為從一般人的角度來看,比如2乘以2.3.5分別為4、6、10,3乘以2.3.5的話為6、9、15,兩個結果中有交叉的部分 ,接下來就想建立一個存儲結構,將生成的這些丑數都保存進來,于是想,會不會有一種數據結構能夠支持查找數據結構中的元素呢,在O(1)的復雜度里找到這個元素是否存在于這個數據結構里,換句話來說,我想用哈希的思想,但是又礙于空間的消耗 想走一個捷徑。。于是。。百思不得其解 看了書上給的解法收到了啟發,思路很簡單,我們換種丑數的計算方式,不是靠“插入”這種操作,而是根據之前的數組里的東西,“生成”丑數,丑數的生成因子只有2、3和5,那么我們可以保存三個index,下標分別為2、3、5,在已生成的丑數中尋找下標,尋找這個下標對應的丑數乘以各自的生成因子后第一個大于已有丑數中的最大值,分別保存這三個下標,并從生成的三個數中找到最小的,添加到丑數的末尾,以此循環生成丑數。
?
根據此思想寫出的代碼如下:
#include<iostream>#include<vector>
int?min(int?x,int?y)
{
????int?min;
????x?>?y???min?=?y?:?min?=?x;
????return?min;
}
void?generate_ugly(int?*ugly,int?length,int?&T2,int?&T3,int?&T5)
{
????int?max?=?ugly[length-1];
????int?i;
????for(i=T2;i<length;i++)
????{
????????if(ugly[i]*2?>?ugly[length-1])
????????{
????????????T2?=?i;
????????????break;
????????}
????}
????for(i=T3;i<length;i++)
????{
????????if(ugly[i]*3?>?ugly[length-1])
????????{
????????????T3?=?i;
????????????break;
????????}
????}
????for(i=T5;i<length;i++)
????{
????????if(ugly[i]*5?>?ugly[length-1])
????????{
????????????T5?=?i;
????????????break;
????????}
????}
????ugly[length]?=?min(min(ugly[T2]*2,ugly[T3]*3),ugly[T5]*5);
}
using?namespace?std;
int?main()
{
????int?ugly[1500]={1,2,3,4,5};
????int?i,length=5,T2,T3,T5;
????for(i=0;i<length;i++)
????{
????????if(ugly[i]*2?>?ugly[length-1])
????????{
????????????T2?=?i;
????????????break;
????????}
????}
????for(i=0;i<length;i++)
????{
????????if(ugly[i]*3?>?ugly[length-1])
????????{
????????????T3?=?i;
????????????break;
????????}
????}
????for(i=0;i<length;i++)
????{
????????if(ugly[i]*5?>?ugly[length-1])
????????{
????????????T5?=?i;
????????????break;
????????}
????}
????for(i=0;i<1495;i++)
????{
????????generate_ugly(ugly,length,T2,T3,T5);
????????length++;
????}
????cout?<<?ugly[1499]?<<?endl;
????system("pause");
????
????return?0;
}?
看到結果的時候擔心了一下,說這int類型會不會溢出? 于是lz很小白的去網上查找了int類型的表示范圍,和編譯器的位數有關。比如說32位的編譯器,int類型的表示范圍為2^32 -1 ~ - 2^32?。
轉載于:https://www.cnblogs.com/xiawen/archive/2013/04/15/3022095.html
總結
- 上一篇: 交通搜狐视频联名信用卡申请条件:高额度卡
- 下一篇: 3013-04-13 腾讯笔试