一、問題介紹
輸入一個正整數數組,把數組裏所有數字拼接起來排成一個數,打印能拼接出的所有數字中最小的一個。例如輸入數組{3,32,321},則打印出這三個數字能排成的最小數字爲321323。
二、解題思路
定義新的大小關係,對vector容器內的數據進行排序,
按照 將a和b轉爲string後
若 a+b<b+a a排在b之前的規則排序,
如 2 21 因爲 21 2 < 2 21 所以 排序後爲 21 2
to_string() 可以將int轉化爲string,方便組合後比較,不用管各數的位數
例:輸入數組{3,32,321}
按這種規則,321 < 32 < 3,則最小數爲 321 32 3
三、代碼實現
#include <iostream>
#include <stdio.h>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
static bool cmp(int a, int b) //必須定義成static類型才能被sort使用
{
string A = to_string(a) + to_string(b);
string B = to_string(b) + to_string(a);
return A < B;//利用字符串的比較方法
}
string PrintMinNumber(vector<int> numbers)
{
sort(numbers.begin(), numbers.end(), cmp);//用自定義的排序方法從小到大進行排序
string answer;
for(int ai:numbers) {
answer += to_string(ai);
}
return answer;
}
int main()
{
vector<int> vec;
vec.push_back(23);
vec.push_back(991);
vec.push_back(11);
vec.push_back(2);
string res = PrintMinNumber(vec);
cout<< res <<endl;
return 0;
}
輸入:[23, 991, 11, 2]
結果:
11223991