输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。
示例 1:
输入: [10,2]
输出: "102"
//考虑的很多,但是没什么用的本人
class Solution {
public:
static bool cmp(string str1, string str2)
{
int len1 = str1.length();
int len2 = str2.length();
int i = 0, j = 0;
for (; i < len1 && j < len2; ++i, ++j)
{
if (str1[i] < str2[j])
return true;
}
if (i == len1 || j == len2)
{
if (str1 + "0" == str2)
return false;
if (str2 + "0" == str1)
return true;
}
return false;
}
string minNumber(vector<int>& nums) {
//数组已经说明全部是正整数
string ans = "";
int num = nums.size();
vector<string> buff; buff.clear();
for (int i = 0; i < num; ++i)
{
buff.push_back(to_string(nums[i]));
}
sort(buff.begin(), buff.end(), cmp);
for(int i = 0; i < buff.size(); ++i)
{
ans += buff[i];
}
return ans;
}
};
思路很棒的排序策略
class Solution {
public:
string minNumber(vector<int>& nums) {
sort(nums.begin(), nums.end(), [](int a, int b){
string astr = to_string(a);
string bstr = to_string(b);
return (astr+bstr).compare(bstr+astr) < 0;
});
string ans;
int size = nums.size();
for(int i = 0; i < size; ++i){
ans += to_string(nums[i]);
}
return ans;
}
};
双百的大佬:思路清晰!
class Solution {
public:
static bool my(string num1,string num2)
{
int len1=num1.length(),len2=num2.length();
if(len1==len2)
{
return num1<num2;
}
else if(len1>len2)
{
int i=0;
while(i<len2)
{
if(num1[i]<num2[i])
return true;
else if(num1[i]>num2[i])
return false;
else
i++;
}
int j = 0 ;
while(j<len2)
{ if(num2[j]<num1[i]) return false;
else if(num2[j]>num1[i]) return true;
else j++;
}
j--;
while(i<len1)
{
if(num2[j]<num1[i]) return false;
else if(num2[j]>num1[i]) return true;
else i++;
}
return true;
}
else
{
int i =0;
while(i<len1)
{
if(num1[i]<num2[i])
return true;
else if(num1[i]>num2[i])
return false;
else
i++;
}
int j=0;
while(j<len1)
{ if(num1[j]<num2[i]) return true;
else if(num1[j]>num2[i]) return false;
else j++;
}
j--;
while(i<len2)
{
if(num1[j]<num2[i]) return true;
else if(num1[j]>num2[i]) return false;
else i++;
}
return true;
}
}
string minNumber(vector<int>& nums) {
vector<string> number;
for(int i=0;i<nums.size();i++)
number.push_back(to_string(nums[i]));
sort(number.begin(),number.end(),my);
string result;
for(int i=0; i< number.size();i++)
{
result+= number[i];
cout<<" "<<number[i];
}
return result;
}
};