• 【剑指Offer面试编程题】题目1504:把数组排成最小的数--九度OJ


    题目描述:

    输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。

    输入:

    输入可能包含多个测试样例。
    对于每个测试案例,输入的第一行为一个整数m (1<=m <=100)代表输入的正整数的个数。
    输入的第二行包括m个正整数,其中每个正整数不超过10000000。

    输出:

    对应每个测试案例,
    输出m个数字能排成的最小数字。

    样例输入:

    3
    23 13 6
    2
    23456 56
    样例输出:

    13236
    2345656
    【解题思路】这道题目首先需要看破的一点就是我们需要用字符串来处理,因为当数字拼接是很容易超过机器最大数。另外,我们需要从最简单、最原始的想法出发,来判断数字应该怎么拼接。我们可以想象成对给定的一堆字符串排序,使得最后的排序结果拼接后具有最小值,那么问题就转化为两个字符串谁前谁后的问题。问题已经很明了了,我们可以直接拼接两个字符串a,b成ab和ba。当a放前面拼接后的结果小则a应该放前面,否则b应该放前面。

    AC code:

    #include <cstdio>
    #include <vector>
    #include <string>
    #include <algorithm>
    using namespace std;
     
    bool cmp(const string &str1,const string &str2)
    {
      string stra=str1+str2;
      string strb=str2+str1;
      return stra<strb;
    }
     
    int main()
    {
      int n;
      while(scanf("%d",&n)!=EOF)
      {
        vector<string> vecstr;
        string str;
        char cc[10];
        for(int i=0;i<n;++i)
        {
          scanf("%s",&cc);
          str=string(cc);
          vecstr.push_back(str);
        }
        sort(vecstr.begin(),vecstr.end(),cmp);
        for(int i=0;i<n;++i)
          printf("%s",vecstr[i].c_str());
        printf("
    ");
      }
      return 0;
    }
    /**************************************************************
        Problem: 1504
        User: huo_yao
        Language: C++
        Result: Accepted
        Time:190 ms
        Memory:1056 kb
    ****************************************************************/
    

    题目链接:http://ac.jobdu.com/problem.php?pid=1504

    九度-剑指Offer习题全套答案下载:http://download.csdn.net/detail/huoyaotl123/8276299



  • 相关阅读:
    PAT (Advanced Level) Practice 1071 Speech Patterns (25分)
    PAT (Advanced Level) Practice 1070 Mooncake (25分)
    PAT (Advanced Level) Practice 1069 The Black Hole of Numbers (20分)
    PAT (Advanced Level) Practice 1074 Reversing Linked List (25分)
    PAT (Advanced Level) Practice 1073 Scientific Notation (20分)
    第一次冲刺个人总结01
    构建之法阅读笔记01
    人月神话阅读笔记01
    四则运算2
    学习进度条(软件工程概论1-8周)
  • 原文地址:https://www.cnblogs.com/huoyao/p/4248888.html
Copyright © 2020-2023  润新知