pat1038

  这一问就是要将找出各个字符串如何组合才能使得组成的数字最小;

首先我的思路是:关键在于如何寻找任何两个字符串的排列方式,写成一个cmp的bool类型函数,然后用sort,将其排序,然后将所有的字符串相连接成一个较长的字符串,最后输出来,注意去掉前面的0;

在写cmp函数时,我的思路是:从前到后比较两个字符串的每一位,找到第一位不同的时候就返回这位数字的大小比较,如果直到一个字符串结束时都全部一样,就将较短的那个的第一位和较长的那个字符串的对应位比较,例如比较234和23时将2和4比较。

特别注意:在cmp函数中如果有多个比较的时候要注意将较小的部分放成相同的

后来发现这种方法容易出错,借鉴了一下大佬的:可以考虑两个字符串加起来后先后顺序的比较,例如234和34时,只比较23434和34234就可以了,然后注意一下转化函数stroi。。。其实很好记,string to int

最后有个小坑。。当所有的都是0的时候要记得输出一个0。

//
//  main.cpp
//  1038
//
//  Created by DouglasLee on 18/3/3.
//  Copyright © 2018年 DouglasLee. All rights reserved.
//

#include <iostream>
#include<string.h>
#include<algorithm>
#include<vector>
using namespace std;
vector<string> s;
bool cmp1(string s1,string s2){
    string ss1=s1+s2;
    string ss2=s2+s1;
    long k1=stol(ss1);
    long k2=stol(ss2);
    return k1<k2;
}
bool cmp(string s1,string s2){
    int po=0;
    int flag=0;
    while(s1[po]!='\0'&&s2[po]!='\0')
    {
        if(s1[po]==s2[po])
            po++;
        else{
            flag=1;
            break;
        }
    }
    if(flag==1)
        return s1[po]<s2[po];
    else if(s1.length()<s2.length()){//s1 比较短,到头了
        return s1[0]<s2[po];
    }
    else
        return s1[po]<s2[0];
}

int main(int argc, const char * argv[]) {
    int n;
    cin>>n;
    for(int i=0;i<n;i++){
        string tmp;
        cin>>tmp;
        s.push_back(tmp);
    }
    sort(s.begin(),s.end(),cmp1);
    int size=s.size();
    int p=0;
    
    string ss;
    for(int i=0;i<size;i++){
        ss+=s[i];
        //cout<<s[i];
    }
    while(ss[p]=='0')
        p++;
    int kkk=0;
    while(ss[p]!='\0'){
        cout<<ss[p++];
        kkk++;
    }
    if(kkk==0)
        cout<<0;
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值