問題描述:
? ? ? ? 把只包含因子2、3和5的數(shù)稱作丑數(shù)(Ugly Number)儡嘶。例如6、8都是丑數(shù)恍风,但14不是蹦狂,因?yàn)樗蜃?誓篱。 習(xí)慣上我們把1當(dāng)做是第一個(gè)丑數(shù)。求按從小到大的順序的第N個(gè)丑數(shù)凯楔。
問題分析:
? ? ?第一個(gè)丑數(shù)為1窜骄,后面求丑數(shù)可根據(jù)思想,若p為丑數(shù)摆屯,則2*p,3*p,5*p均為丑數(shù)邻遏,換句話說,丑數(shù)可以通過已是丑數(shù)的數(shù)乘以2或3或5形成虐骑,但考慮到從小到大的問題准验。所以可以通過三個(gè)變量i2,i3,i5控制乘2、乘3和乘5的操作進(jìn)行廷没。
代碼如下:
publicclassSolution {
publicintGetUglyNumber_Solution(intindex)
{
if(index<=0)
return0;
intresult[] =newint[index];
result[0] =1;
inti =1;
inti2=0,i3=0,i5=0;
while(i
{
inttemp = min(result[i2]*2,min(result[i3]*3,result[i5]*5));//每次只需比較*2和*3和*5中最小的
if(temp ==result[i2]*2) i2++;//這三句起到了遍歷和去重的效果糊饱;
if(temp ==result[i3]*3) i3++;//比如2*3和3*2為同一個(gè)數(shù),result[1] = 2,result[2]=3故此處操作
if(temp ==result[i5]*5) i5++;//可將result[1]*3和result[2]*2去掉重復(fù)腕柜。
result[i++] = temp;
}
returnresult[index-1];
}
publicstaticintmin(inta,intb)
{
ints = (a < b?a:b);
returns;
}
}
--daytwo