5.19打卡:劍指 offer兩題:把數組排成最小的數/醜數

把數組排成最小的數

題目描述

輸入一個正整數數組,把數組裏所有數字拼接起來排成一個數,打印能拼接出的所有數字中最小的一個。例如輸入數組{3,32,321},則打印出這三個數字能排成的最小數字爲321323。

思路:

對vector容器內的數據進行排序,按照 將a和b轉爲string後,若 a+b<b+a,a排在在前的規則排序, 如 2,21 因爲 212 < 221 所以 排序後爲 21 2。
注:int 轉化爲 string,使用to_string();string 轉 int,使用atoi(string_type.c_str())。

class Solution {
public:
    static bool cmp(int a, int b)
    {
        string x = to_string(a)+to_string(b);
        string y = to_string(b)+to_string(a);
        return x < y;
    }
    
    string PrintMinNumber(vector<int> numbers) {
        sort(numbers.begin(), numbers.end(), cmp);
        string res = "";
        for(int i = 0; i < numbers.size(); i ++) res += to_string(numbers[i]);
        return res;
    }
};

醜數

題目描述

把只包含質因子2、3和5的數稱作醜數(Ugly Number)。例如6、8都是醜數,但14不是,因爲它包含質因子7。 習慣上我們把1當做是第一個醜數。求按從小到大的順序的第N個醜數。

參考:https://www.nowcoder.com/questionTerminal/6aa9e04fc3794f68acf8778237ba065b?answerType=1&f=discussion

思路:安排3個隊列分別存放 ×2、×3、×5的數,爲什麼這麼做?因爲我們需要每次從三個隊列中的頭部取出其中最小的值,然後將這個值再分別×2、×3、×5存放到那三個隊列的尾部,這會使得這三個隊列是有序的(從小到大)。
初始化:
q_2 = [1, ]
q_3 = [1, ]
q_5 = [1, ]
第一輪:
res = 1 (將三個隊列的頭部爲1的都彈出)
q_2 = [1×2, ]
q_3 = [1×3, ]
q_5 = [1×5, ]
第二輪:
res = 2 (將三個隊列的頭部爲2的都彈出)
q_2 = [2×2, ]
q_3 = [1×3, 2×3, ]
q_5 = [1×5, 2×5, ]
第三輪:
res = 3 (將三個隊列的頭部爲3的都彈出)
q_2 = [2×2, 3×2, ]
q_3 = [2×3, 3×3, ]
q_5 = [1×5, 2×5, 3×5, ]
......

class Solution {
public:
    int GetUglyNumber_Solution(int index) {
        queue<int> q_2,q_3,q_5;
        int res = 0;//index=0時,需要返回0
        //初始化,將push到三個隊列裏
        q_2.push(1);
        q_3.push(1);
        q_5.push(1);
        for(int i = 0; i < index; i ++)
        {
            //選取三個隊列頭部最小的值
            res = min(q_2.front(), min(q_3.front(),q_5.front()));
            //分別將res*2,*3,*5放到三個隊列裏
            q_2.push(res*2);q_3.push(res*3);q_5.push(res*5);
            //彈出三個隊列的頭部爲res的數(
            if(q_2.front()==res) q_2.pop();
            if(q_3.front()==res) q_3.pop();
            if(q_5.front()==res) q_5.pop();
        }
        return res;
    }
};

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章