题目描述
输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
牛客链接:
https://www.nowcoder.com/practice/8fecd3f8ba334add803bf2a06af1b993?tpId=13&&tqId=11185&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking
解题思路
通过把数字转换成字符串,比较两个字符串的大小来获取最小数字
代码一
不利用排序函数,手动通过冒泡实现排序
#include<cstring>
class Solution {
public:
string PrintMinNumber(vector<int> numbers) {
string str1;
string str2;
bool flag = false;
for(int i=0; i<numbers.size(); i++) {
for(int j = i+1; j<numbers.size(); j++) {
str1 = to_string(numbers[i]);
str2 = to_string(numbers[j]);
if (!maxString(str1, str2)) {
int temp = numbers[i];
numbers[i] = numbers[j];
numbers[j] = temp;
flag = true;
}
}
if (!flag) {
break;
}
}
str1 = "";
str2 = "";
for(int i=0; i<numbers.size(); i++) {
str1 = to_string(numbers[i]) + str1;
}
return str1;
}
bool maxString(string str1, string str2) {
string temp1 = str1 + str2;
string temp2 = str2 + str1;
if (temp1 >= temp2) {
return true;
} else {
return false;
}
}
};
代码二:
class Solution {
public:
string PrintMinNumber(vector<int> numbers) {
if(numbers.size()<=0)
return "";
sort(numbers.begin(), numbers.end(),cmp);
string res;
for(int i=0;i<numbers.size();i++){
res+=to_string(numbers[i]);
}
return res;
}
static bool cmp(int a,int b){
string A=to_string(a)+to_string(b);
string B=to_string(b)+to_string(a);
return A<B;
}
};
注意:
数组排序
数组转换成字符串