把數組排成最小的數

一、問題介紹

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

 

 

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