zoukankan      html  css  js  c++  java
  • 数串

    题目描述

    设有n个正整数,将他们连接成一排,组成一个最大的多位整数。
    如:n=3时,3个整数13,312,343,连成的最大整数为34331213。
    如:n=4时,4个整数7,13,4,246连接成的最大整数为7424613。

    输入描述:

    有多组测试样例,每组测试样例包含两行,第一行为一个整数N(N<=100),第二行包含N个数(每个数不超过1000,空格分开)。

    输出描述:

    每组数据输出一个表示最大的整数。
    示例1

    输入

    2
    12 123
    4
    7 13 4 246
    

    输出

    12312
    7424613

    最终AC代码:

    #include <iostream>
    #include <string>
    #include <vector>
    #include <algorithm>
    using namespace std;
    bool cmp(string s1, string s2){
        return (s1+s2)>(s2+s1); //这里很妙!!!
    }
    int main(){
        int i, n;
        string s;
        vector<string> vs;
        while(scanf("%d", &n) != EOF){
            vs.clear();
            for(i=0; i<n; i++){
                cin>>s;
                vs.push_back(s);
            }
            sort(vs.begin(), vs.end(), cmp);
            s = "";
            for(i=0; i<vs.size(); i++) s += vs[i];
            cout<<s<<endl;
        }
        return 0;
    }

    总结:题目来源于牛客网,对应的难度好像不小,正确率低于20%。

    第一眼看见这个题目时,我就觉得很熟悉,感觉做过类似的题目,故认为应该比较简单了。但真正动手敲代码时,就卡住了。怎么给字串排序呢?举一个例子,就足以说明难点了。

    比如:1、排序前:123 12 =>排序后:123 12 ; 2、排序前:121 12 => 12 121。只有这样,才能满足题干组成最大数的条件。

    虽然有库,不用自己手写排序算法,但是这个排序逻辑着实不好操作,我在这里折腾了半个小时。(当然,大神可能觉得简单,没啥折腾的)

    然后,想到了既然是让排序后的结果能够组成最大的数,那么在排序时不就可以比较吗?于是就有了以下代码:

    bool cmp(string s1, string s2){
        return (s1+s2)>(s2+s1); //这里很妙!!!
    }

    我没想到,一个看似挺复杂的逻辑,这么一句简洁的代码就解决了!当然思路的转变主要在于,我原先只是比较s1与s2,试图以此得到一个排序逻辑,却一直解决不了。之后转变思路,将s1与s2拼接,那么不就正好满足条件了吗?还是以上面的例子举例:

    比如:1、排序前:123 12 => 排序时:s1+s2:12312,s2+s1:12123,一比较后返回true =>排序后:123 12;2、排序前:121 12 => 排序时:s1+s2:12112,s2+s1:12121,一比较后返回false=>排序后:12 121。

    这里有一个很大的妙处在于----拼接。于是使得被比较的两端字串长度相等,所以就不存在短串是长串的前半部分的问题了。我也不知道对于此题,是否还有其他前辈总结过,只是这点突然的奇妙思想让我有些激动,因此写下勉励自己可以在今后的题目也多创新一些,写出一些好思路。仅此。

  • 相关阅读:
    mock.js 模拟数据
    pa
    观察者模式
    WebSocket
    Nginx官方文档学习
    Java中文乱码解决
    Jersey+Spring+Maven(转)
    App架构经验总结(转)
    JSONP跨域的原理解析(转)
    mongoDB学习
  • 原文地址:https://www.cnblogs.com/heyour/p/12488815.html
Copyright © 2011-2022 走看看