【剑指offer-解题系列(33)】把数组排成最小的数
来源:互联网 发布:好听网络歌曲排行榜 编辑:程序博客网 时间:2024/05/21 17:10
题目描述
输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
分析
主要思想是实现一个比较函数cmp,然后利用这个函数进行排序,得到最终序列,排序方法使用快排,冒泡均可。
代码实现
string PrintMinNumber(vector<int> numbers) {
if(numbers.size()<=0)
return "";
vector<string> strs;
char tmp[256]={'\0'};
for(auto a = numbers.begin();a!=numbers.end();a++)
{
sprintf(tmp ,"%d", *a );
strs.push_back(string(tmp));
}
qsort(strs,0,strs.size()-1);
string res;
for(auto a = strs.begin();a!=strs.end();a++)
{
res+=*a;
}
return res;
}
void qsort(vector<string>&numbers,int start,int end){
if(start>=end)
return;
string value = numbers[end];
int ind = start;
for(int i = start;i<end;i++){
if( cmp(numbers[i],value,0,0)<0){
swap(numbers[i],numbers[ind++]);
}
}
swap(numbers[ind],numbers[end]);
qsort(numbers, start,ind-1);
qsort(numbers, ind+1,end);
}
int cmp(string& a,string& b,int start_a,int start_b){
unsigned long i=start_a,j=start_b;
while(i<a.size()&&j<b.size())
{
if(a[i]>b[j])
return 1;
else if(a[i]<b[j])
return -1;
else{
i++;
j++;
}
}
if(i==a.size()&&j==b.size())
return 0;
else if(i==a.size())
return cmp(a,b,0,j);
else if(j==b.size())
return cmp(a,b,i,0);
return 0;
}
if(numbers.size()<=0)
return "";
vector<string> strs;
char tmp[256]={'\0'};
for(auto a = numbers.begin();a!=numbers.end();a++)
{
sprintf(tmp ,"%d", *a );
strs.push_back(string(tmp));
}
qsort(strs,0,strs.size()-1);
string res;
for(auto a = strs.begin();a!=strs.end();a++)
{
res+=*a;
}
return res;
}
void qsort(vector<string>&numbers,int start,int end){
if(start>=end)
return;
string value = numbers[end];
int ind = start;
for(int i = start;i<end;i++){
if( cmp(numbers[i],value,0,0)<0){
swap(numbers[i],numbers[ind++]);
}
}
swap(numbers[ind],numbers[end]);
qsort(numbers, start,ind-1);
qsort(numbers, ind+1,end);
}
int cmp(string& a,string& b,int start_a,int start_b){
unsigned long i=start_a,j=start_b;
while(i<a.size()&&j<b.size())
{
if(a[i]>b[j])
return 1;
else if(a[i]<b[j])
return -1;
else{
i++;
j++;
}
}
if(i==a.size()&&j==b.size())
return 0;
else if(i==a.size())
return cmp(a,b,0,j);
else if(j==b.size())
return cmp(a,b,i,0);
return 0;
}
阅读全文
0 0
- 【剑指offer-解题系列(33)】把数组排成最小的数
- 剑指offer系列源码-把数组排成最小的数
- 【剑指offer系列】 把数组排成最小的数___33
- 剑指offer-33:把数组排成最小的数
- 剑指offer 33 把数组排成最小的数
- 《剑指offer》:[33]把数组排成最小的数
- 剑指Offer 33 把数组排成最小的数
- 剑指offer 面试33 把数组排成最小的数
- 剑指offer 33 把数组排成最小的数
- 剑指offer(34):把数组排成最小的数
- 剑指offer(29)-把数组排成最小的数
- 剑指offer:把数组排成最小的数(java)
- 剑指offer-把数组排成最小的数(Java)
- 把数组排成最小的数(剑指Offer)
- 剑指Offer系列-面试题33:把数组排成最小的数
- 剑指Offer面试题33(java版):把数组排成最小的数
- 剑指offer-5-面试33:把数组排成最小的数(时间效率)
- 剑指offer:(33)时间效率 :把数组排成最小的数
- SpringMVC执行流程
- Linux总结笔记6-配置Samba服务实现Linux和Windows之间文件共享
- 【机房重构】--datatable转泛型时,部分字段信息不显示
- 在Windows10下安装CPU版本TensorFlow
- [NOIP]正整数的表示
- 【剑指offer-解题系列(33)】把数组排成最小的数
- 【数据结构基础】前序、中序、后序线索化二叉树(非递归实现)
- RAM和ROM
- mui HTML5 plus 下载文件
- 李开复:人工智能可能会让一半人失业
- 《四》判断二维码是否含有关注者信息
- ratingbar设置星星个数
- OpenMP Sections
- 聊聊并发-Java中的Copy-On-Write容器(转载)