1. 程式人生 > >牛客網劍指offer-醜數

牛客網劍指offer-醜數

題目描述

把只包含因子2、3和5的數稱作醜數(Ugly Number)。例如6、8都是醜數,但14不是,因為它包含因子7。 習慣上我們把1當做是第一個醜數。求按從小到大的順序的第N個醜數。
class Solution {
public:
    //利用3個佇列,分別儲存乘以2、3、5的新數,每次只需判斷每個
    //佇列最前面的數哪個最小,然後取出並把這個數乘上對應的因子壓入
    //三個佇列中(這裡要去重,具體看程式碼)
	int GetUglyNumber_Solution(int index) {
		if (index <= 0)
			return 0;
		--index;
		queue<int> q2, q3, q5;
		q2.push(2);
		q3.push(3);
		q5.push(5);
		queue<int> *p;
		int ans = 1;
		while (index)
		{
			p = q2.front() < q3.front() ? &q2 : &q3;
			p = (*p).front() < q5.front() ? p : &q5;
			ans = (*p).front();
			(*p).pop();
            //flag來記錄是那個佇列取出的最小數
            int flag = 0;
            if(p == &q2)
                flag = 1;
            else if(p == &q3)
                flag = 2;
            else
                flag = 3;
            //這裡的處理是去重,q3的不再壓入q2,q5的不再壓入q3和q2
            switch(flag)
            {
                case 1:q2.push(ans * 2);
                case 2:q3.push(ans * 3);
                case 3:q5.push(ans * 5);
            }
			--index;
		}
		return ans;
	}
};