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

题目描述

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

思路

思路(1):看到这个题目我第一思路就是将数组里面的数字进行一个全排列,然后再对全排列的所有数字进行比较取最小的;但是该方法费时,费空间。代码不值得用。

思路(2):
1-我们先把int型数组用to_string函数转换成字符串;
2-我们用sort 函数对整个vector 中的字符串进行一个排序,但是这个排序规则需要我们自己设定。
规则:比如数字A和B,会排列成AB和BA 两个数字,若AB<BA ,则我们认为A<B。看具体代码。
3-将排列好的字符串合并成一个字符串输出。

思路(2)代码

class Solution {
public:
   bool comp(const string & s1, const string & s2) {
		string res1, res2;
		res1 = s1 + s2;
		res2 = s2 + s1;
		return res1 < res2;
	}

	string PrintMinNumber(vector<int> numbers) {
		int len = numbers.size();
		string result="";
		vector<string> s;
		for (int i = 0; i < len; i++) {
			string tmp;
			tmp = to_string(numbers[i]);
			s.push_back(tmp);
		}
		sort(s.begin(), s.end(), comp);
		for (int j = 0; j < len; j++) {
			result += s[j];
		}
		return result;
	}
};
发布了57 篇原创文章 · 获赞 28 · 访问量 4116

猜你喜欢

转载自blog.csdn.net/weixin_41747893/article/details/104704182