直接解题需要将int数组中所有元素的排列都列出来,逐一比较。看到题目中给出了贪心的tag,所以一定能用更快的方法来做。选择用比较直接的类似冒泡排序的思路来做。即只两两比较int数组中元素所组成的数字,将大的往后放。
先将int数组中的元素使用to_string()方法存入string数组中。
使用二重循环遍历string数组,将当前元素与下一元素拼接为两个字符串,一个是当前元素在前,另一个是下一元素在前。将这两个拼接好的字符串使用atoi(str.c_str())转为int,比较这两个int的大小。若当前元素在前的int较大,则交换两个字符串在数组中的位置,即向上冒泡。
最后得到排好序的string数组,其中与其他字符串组成的数字小的字符串在前,大的在后。
最后只需按顺序将该字符串数组组成一个字符串即可。
class Solution {
public:
string PrintMinNumber(vector<int> numbers) {
string res = "";
if(numbers.empty()){
return res;
}
vector<string> strN(numbers.size());
for(int i = 0;i < strN.size();i++){
strN.at(i) = to_string(numbers.at(i));
}
for(int i = 0;i < strN.size() - 1;i++){
for(int j = 0; j < strN.size() - i - 1;j++){
string ab = strN.at(j) + strN . at(j + 1);
string ba = strN.at(j + 1) + strN.at(j);
int abn = atoi(ab.c_str());
int ban = atoi(ba.c_str());
if(abn > ban){
string temp = strN.at(j);
strN.at(j) = strN.at(j + 1);
strN.at(j + 1) = temp;
}
}
}
for(int i = 0;i < strN.size();i++){
res += strN.at(i);
}
return res;
}
};