剑指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;}