class Solution {
public:
struct cmp{
bool operator()(string a, string b){return a+b < b+a ;}
}cmp;
string minNumber(vector<int>& nums) {
vector<string> vec;
for(auto num: nums)
vec.push_back(to_string(num));
sort(vec.begin(),vec.end(),cmp);
string result = "";
for(auto it=vec.begin();it!=vec.end();it++){
string str = *it;
result += str;
}
return result;
}
};
证明见《剑指offer 第二版》P229-P230
书中有一步
A
1
A
2
⋯
A
y
−
1
A
y
⋯
A
n
<
A
1
A
2
⋯
A
y
A
y
−
1
⋯
A
n
A_{1}A_{2}\cdots A_{y-1}A_{y} \cdots A_{n} < A_{1}A_{2}\cdots A_{y}A_{y-1} \cdots A_{n}
A1A2⋯Ay−1Ay⋯An<A1A2⋯AyAy−1⋯An
让读者自己证明,下给出证明
因为
A
y
−
1
A
y
<
A
y
A
y
−
1
A_{y-1}A_{y} < A_{y}A_{y-1}
Ay−1Ay<AyAy−1
且两个字符串中
A
1
A
2
⋯
A
y
−
2
X
X
A
y
+
1
⋯
A
n
A_{1}A_{2}\cdots A_{y-2} XX A_{y+1}\cdots A_{n}
A1A2⋯Ay−2XXAy+1⋯An部分相同,且XX等长。所以
A
1
A
2
⋯
A
y
−
1
A
y
⋯
A
n
<
A
1
A
2
⋯
A
y
A
y
−
1
⋯
A
n
A_{1}A_{2}\cdots A_{y-1}A_{y} \cdots A_{n} < A_{1}A_{2}\cdots A_{y}A_{y-1} \cdots A_{n}
A1A2⋯Ay−1Ay⋯An<A1A2⋯AyAy−1⋯An