欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

PAT A1038 Recover the Smallest Number (30)

程序员文章站 2022-04-10 19:40:39
PTA跳转:原题链接题目大意:给定N组数字串,找出这些数字串中能组合出的最小数字。例如,给出【32, 321, 3214, 0229, 87】,可以得到很多类似【32-321-3214-0229-87】或【0229-32-87-321-3214】这样的数字串。其中,【0229-32-87-321-3214】是最小的,输出【22932132143287】即完成此题。(消去"-"和开头的0)想了很久如何排序,无解。看了柳神的代码,甘拜下风。#include #includ...

PTA跳转:原题链接

题目大意:给定N组数字串,找出这些数字串中能组合出的最小数字。例如,给出【32, 321, 3214, 0229, 87】,可以得到很多类似【32-321-3214-0229-87】或【0229-32-87-321-3214】这样的数字串。其中,【0229-32-87-321-3214】是最小的,输出【22932132143287】即完成此题。(消去"-"和开头的0)

想了很久如何排序,无解。看了柳神的代码,甘拜下风。

#include <iostream>
#include <string>
#include <algorithm>
using namespace std;

bool cmp(string a, string b)
{
	//因为a+b和b+a的长度是一样的,可以进行比较,而且每次排序后,前面的字符串总要小于后面(比较ASCII码) 
    return a + b < b + a; 
}

string str[10010];

int main()
{
    int n;
    cin >> n;
    for(int i = 0; i < n; i++)
        cin >> str[i];
    sort(str, str + n, cmp);	//即可得到答案(首数字可能是0,还需要进一步操作) 
    string s;
    for(int i = 0; i < n; i++)
        s += str[i];
    while(s.length() != 0 && s[0] == '0')	//长度不为0,但首数字为0
        s.erase(s.begin());	//把在开头的数字0删掉
    if(s.length() == 0)	//字符串中全是数字0,全删了
		cout << 0; 
    cout << s;
    return 0;
}

氷鸢鸢鸢
2020.7.13

本文地址:https://blog.csdn.net/koori_145/article/details/107324326