输入一个正整数数组,输入一个正整数数组,把数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。

时间:2022-03-06 15:09:40
剑指offer:输入一个正整数数组,输入一个正整数数组,把数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
思路:两个数比较,哪个更适合放在前面,可以将两个数拼起来,谁放在前面,拼起来的数小,谁就更适合放在前面。
关键是要会用,stringstream做int和string的转换,还要会用sort排序。
代码如下:#include "stdafx.h"#include <stdio.h>#include <stdlib.h>#include <string.h>#include <iostream>#include <vector>#include <sstream>#include <functional>#include <algorithm>using namespace std; bool less_second(const string &s1,const string &s2){      string str1 = s1 + s2;  string str2 = s2 + s1;  return str1 < str2; }class Solution {public:    string PrintMinNumber(vector<int> numbers) {        int length = numbers.size();string result;        if(length <= 0)            return result;vector<string> strVec;//利用stringstream将int转换为stingfor(int i = 0; i < length; i++){    stringstream ss;string str;ss << numbers.at(i);ss >> str;strVec.push_back(str);}sort(strVec.begin(),strVec.end(),less_second);//排序函数,第三个参数默认是less,但是可以自己指定函数指针for(int i = 0; i < length; i++){result += strVec.at(i);}        return result;    }};  int main(){int a[] = {32,3,321};vector<int> myVec(&a[0],&a[3]);vector<string> strVec;    Solution s;string result = s.PrintMinNumber(myVec);    return 0;}