贪心--拼接最小数(题解)

题目描述

给定n个可能含有前导0的数字串,将它们按任意顺序拼接,使生成的整数最小。

输入描述

第一行为一个正整数n(1≤n≤104),表示数字串的个数。

第二行给出n个数字串(1≤每个串的长度≤9),用空格隔开。

输出描述

输出一个整数,表示能生成的最小整数(需要去掉前导0)。

样例1

输入   3 53 01 2

输出    1253

解释    按01、2、53的顺序拼接,能得到最小整数1253。

思路:利用sort()函数将字符串排序,再将其依次拼接起来,除去开头0,输出;


#include <iostream>
#include<algorithm>

using namespace std;

static bool cmp(string a,string b){
    return a+b<b+a;
}                          //cmp比较器

int main()
{
    int n;
    cin>>n;    //n个字符串
    string a[n];
    for(int i=0;i<n;i++) //依次输入
    {
        cin>>a[i];
    }
    
    sort(a, a+n, cmp);//使用sort函数进行排序
    
    string str1;
    for(int i=0;i<n;i++){//拼接
        str1+=a[i];
    }
    
    int sign=0;
    for(int i=0;i<str1.length();i++){
        
        if((sign!=0)||(str1[i]!='0'))
                  cout<<str1[i];
        if(str1[i]!='0')
                   sign=1;
            
    }
    if(sign==0)
        cout<<0;
    
    //long long int i=stoi(str1);默认为int范围
   // cout<<i;
    //cout<<atoi(str1.c_str())<<endl;
    return 0;
}

Part1:

cmp中的排序标准为 return a+b<b+a; 即拼接后值更小的方式排;

Part2:

当所谓字符串全为0,输出0;

Part3:

初开头0:一方面看开头的数字是否为0,另一方面要防误触非开头0;

a.利用函数将字符串直接转化为数字,利用sscanf() /  atoi() / stoi() 函数,but由于本输出结果范围超出int类型(stoi()默认范围为int型,不可用。

b.利用erase()函数

while (result.length() > 1 && result[0] == '0') {
     result.erase(result.begin());
 }
 cout << result << endl;

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值