题目链接
题意:数组中的数字拼接为最小数值
比如:2,3,321,32,323
拼接结果为:2321323233
个人用的很麻烦的,纯粹手动实现算法,现在有更漂亮的代码!
我的思路是:
初始化:记住每个数值的长度,将所有数字都生成相同长度的数值,循环式生成,比如上例,2生成222,3生成333,,32生成323,即拼到最长数值长度(3),规则为循环式生成!
排序:然后将生成的所有数字排序,为了排序后,长度记录不变,采用了结构体。
拼接:按照之前的长度进行拼接。
C++11中的to_string是神奇的操作!
// 我的代码
#include<bits/stdc++.h>
using namespace std;
struct number{
int value;
int num;
bool operator < (const number &t) const{
if(t.value == value)
return t.num > num;
return t.value > value;
}
};
class Solution {
public:
int numb(int t){
int num = 0;
while(t){
t /= 10;
num += 1;
}
return num;
}
string PrintMinNumber(vector<int> numbers) {
number a[10010];
int maxn = 0;
for(int i = 0; i < numbers.size(); i++){
a[i].num = numb(numbers[i]);
maxn = max(a[i].num,maxn);
a[i].value = numbers[i];
cout<<a[i].num<<endl;
}
cout<<maxn<<endl;
for(int i = 0;i < numbers.size(); i++){
int m = numbers[i];
int t = numbers[i];
if(maxn - a[i].num > 0){
int k = a[i].num - 1;
for(int j = 0;j < maxn - a[i].num; j++){
if(m == 0)
m = t;
if(k == -1)
k = a[i].num - 1;
cout<<"--"<<m<<"--"<<endl;
int po = pow(10,k);
cout<<"--"<<po<<endl;
numbers[i] = numbers[i] * 10 + m / po;
k --;
m = m % po;
cout<<numbers[i]<<"--"<<po<<"--"<<m<<endl;
}
a[i].value = numbers[i];
cout<<numbers[i]<<endl;
}
}
sort(a,a+numbers.size());
string str;
str.clear();
for(int i = 0;i < numbers.size(); i++){
int po = pow(10,maxn - a[i].num);
string st = to_string(a[i].value/po);
str.append(st);
}
return str;
}
};
int main(){
Solution so;
vector<int> v;
v.push_back(3);
v.push_back(323);
v.push_back(2);
v.push_back(321);
v.push_back(32);
cout<<so.PrintMinNumber(v);
}
迷人的代码!!!
class Solution {
public:
static bool cmp(int a,int b){
string A="";
string B="";
A+=to_string(a);
A+=to_string(b);
B+=to_string(b);
B+=to_string(a);
return A<B;
}
string PrintMinNumber(vector<int> numbers) {
string answer="";
sort(numbers.begin(),numbers.end(),cmp);
for(int i=0;i<numbers.size();i++){
answer+=to_string(numbers[i]);
}
return answer;
}
};