把數組排成最小的數
題目描述
輸入一個正整數數組,把數組裏所有數字拼接起來排成一個數,打印能拼接出的所有數字中最小的一個。例如輸入數組{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;
}
};