1. 题目描述
输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
2. 题目分析
首先我想到了前面字符串重新排列并按序输出的那道题。然后我想到了一个方案,就是将数组中的元素进行排列,分别将得到的所有数组链接成字符串,找出最小的一个。但是这个方案在本地运行的时候正常,提交在牛客网的在线编译上就提示“递归层数多或溢出”。这个方案的代码会贴在最下面,时间复杂度和空间复杂度后续再进行分析。
由于自己的方案没有通过,所以就查询了一下别人的方案。还get一下sort()方法的高阶用法。这个用法也后期总结。大致思路就是先将整形数组转换成字符串数组,然后对数组进行排序,排序的规则是两个交换的字符串链接成的字符串从小到达进行排序。Eg:有两个字符串a、b,如果a+b < b+a,那么排序就是a,b。
3. 题目解答——cpp
class Solution {
public:
string PrintMinNumber(vector<int> numbers) {
if (numbers.size() == 0)
return "";
vector<string> str_array;
string ans;
int len = numbers.size();
for (int i = 0; i < len; i++) {
str_array.push_back(to_string(numbers[i]));
}
sort(str_array.begin(), str_array.end(), cmp);
for (int i = 0; i < len; i++) {
ans += str_array[i];
}
return ans;
}
static bool cmp(string a, string b) {
string A = a + b;
string B = b + a;
return A < B;
}
};
4. 附加答案
#include "stdafx.h"
#include <iostream>
#include <math.h>
#include <algorithm>
#include <vector>
#include <string>
using namespace std;
void swap(string &a, string &b) {
string mid = a;
a = b;
b = mid;
}
void ExchangePosition(vector<string> str, int left, int right, vector<string> &answers) {
if (left < 0 || str.size() == 0)
return;
if (left == right) {
string catstr;
for (int i = 0; i < str.size(); i++) {
catstr += str[i];
}
answers.push_back(catstr);
}
for (int i = left; i <= right; i++) {
if (i != right && str[i] == str[right])
continue;
swap(str[i], str[right]);
ExchangePosition(str, left + 1, right, answers);
swap(str[i], str[right]);
}
}
string PrintMinNumber(vector<int> numbers) {
vector<string> answers;
int length = numbers.size();
if (length == 0) {
return NULL;
}
vector<string> numbers_str;
for (int i = 0; i<length; i++) {
numbers_str.push_back(to_string(numbers[i]));
}
/* for (int i = 0; i < length; i++) {
cout << numbers_str[i] << endl;
}*/
int endlen = numbers_str.size();
ExchangePosition(numbers_str, 0, endlen - 1, answers);
sort(answers.begin(), answers.end());
return answers[0];
}
int main() {
vector<int> array;
array.push_back(3);
array.push_back(32);
array.push_back(321);
string a = PrintMinNumber(array);
cout << a << endl;
return 0;
}