题目1504:把数组排成最小的数

题目描写叙述:

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

输入:

输入可能包括多个測试例子。

对于每一个測试案例,输入的第一行为一个整数m (1<=m <=100)代表输入的正整数的个数。

输入的第二行包含m个正整数。当中每一个正整数不超过10000000。

输出:

相应每一个測试案例,

输出m个数字能排成的最小数字。

例子输入:

3

23 13 6

2

23456 56

例子输出:

13236

2345656

//方法一

#include <iostream>
#include<string>
#include<vector>
#include<cstdlib>
#include<algorithm>
using namespace std;
/*
 *字符串比較,长度同样直接比較
 *长度不同一时候,先比較长度同样的部分,若长度同样的部分不同样,则直接进行比較就可以;
 *长度同样的部分同样的,再将长字符串的剩下的部分与短字符串比較;
 *另外,排序函数的使用须要注意到地方还有非常多,qsort(str,0,str+n,cmp);非常美丽的使用方法。而用容器则直接用begin(),end()函数替代
 *cmp比較函数的设计。注意返回值为int类型
 *字符串的比較。用标准模板库里面的函数真的是相当方便。各种函数用的好了非常方便。用的不好,错误一堆
 */
bool cmp(string str1,string str2)
{
    int flag;
    bool isBig;
    int len1=str1.length(),len2=str2.length();
    if(len1==len2)
        flag=str1.compare(str2);
    else
    {
        if(len1<len2)
        {
            if(str2.compare(0,len1,str1)==0)
            {
               isBig=cmp(str1,str2.substr(len1,len2-len1));
               if(isBig)
                return true;
               else
                return false;
            }

            else
                flag= str1.compare(str2);
        }
        else
        {
            if(str1.compare(0,len2,str2)==0)
            {
                isBig=cmp(str1.substr(len2,len1-len2),str2);
                if(isBig)
                    return true;
                else
                    return false;
            }
            else
                flag= str1.compare(str2);
        }
    }
    if(flag==1)
        return false;
    else
        return true;
}
/*
 *整体思路:为了便于比較输入的数中的各位数字的大小。首先将输入的数字当成字符串输入;
 *输入结束后,将字符串按题目要求的规则进行排序。具体排序规则详见比較函数;
 *最后,将排序好的字符串直接输出就是所要求的数字,然后输出;
 *bingo!

*/
int main()
{
    int n;
    while(cin>>n)
    {
        string str;
        vector<string>vec;
        for(int i=0;i<n;i++)
        {
            cin>>str;
            vec.push_back(str);
        }

        sort(vec.begin(),vec.end(),cmp);
        vector<string>::iterator iter=vec.begin();
        for(;iter!=vec.end();iter++)
        {
            cout<<*iter;
        }
        cout<<endl;
    }
    return 0;
}

/**************************************************************
    Problem: 1504
    User: hndxztf
    Language: C++
    Result: Accepted
    Time:170 ms
    Memory:1528 kb
****************************************************************/

//方法二

#include <iostream>
#include<string>
#include<vector>
#include<algorithm>
using namespace std;
/*
 *首先将字符串进行拼接。再直接比較字符串
 *拼接后避免出现321>32>3的情况。那样就成了332321了
 */
bool cmp(string str1,string str2)
{

    string temp1=str1,temp2=str2;
    temp1.append(str2);
    temp2.append(str1);
    return temp1<temp2;
}
/*
 *整体思路:为了便于比較输入的数中的各位数字的大小,首先将输入的数字当成字符串输入。
 *输入结束后,将字符串按题目要求的规则进行排序,具体排序规则详见比較函数;
 *最后。将排序好的字符串直接输出就是所要求的数字,然后输出;
 *bingo!
 */
int main()
{
    int n;
    while(cin>>n)
    {
        string str;
        vector<string>vec;
        for(int i=0;i<n;i++)
        {
            cin>>str;
            vec.push_back(str);
        }

        sort(vec.begin(),vec.end(),cmp);
        vector<string>::iterator iter=vec.begin();
        for(;iter!=vec.end();iter++)
        {
            cout<<*iter;
        }
        cout<<endl;
    }
    return 0;
}

/**************************************************************
    Problem: 1504
    User: hndxztf
    Language: C++
    Result: Accepted
    Time:250 ms
    Memory:1528 kb
****************************************************************/
时间: 2024-08-26 08:24:00

题目1504:把数组排成最小的数的相关文章

【编程题目】把数组排成最小的数

68.把数组排成最小的数(数组.算法).题目:输入一个正整数数组,将它们连接起来排成一个数,输出能排出的所有数字中最小的一个.例如输入数组{32, 321},则输出这两个能排成的最小数字 32132.请给出解决问题的算法,并证明该算法. 思路:首先,肯定要考虑溢出问题.开始想用字符串,后来改为了用list.思路是先把第一个数字放入list,然后依次把后面的数字插入到合适的位置. 关键问题就是如何判断两个数字哪一个在前面. ①对于 353 .412这样的情况,肯定是第一个数字小的在前面 ②遇到数字

剑指OFFER之把数组排成最小的数(九度OJ1504)

题目描述: 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个.例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323. 输入: 输入可能包含多个测试样例.对于每个测试案例,输入的第一行为一个整数m (1<=m <=100)代表输入的正整数的个数.输入的第二行包括m个正整数,其中每个正整数不超过10000000. 输出: 对应每个测试案例,输出m个数字能排成的最小数字. 样例输入: 3 23 13 6 2 23456 56 样

剑指offer系列源码-把数组排成最小的数

题目1504:把数组排成最小的数 时间限制:1 秒内存限制:128 兆特殊判题:否提交:1463解决:448 题目描述: 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个.例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323. 输入: 输入可能包含多个测试样例. 对于每个测试案例,输入的第一行为一个整数m (1<=m <=100)代表输入的正整数的个数. 输入的第二行包括m个正整数,其中每个正整数不超过10000000.

编程算法 - 把数组排成最小的数 代码(C)

把数组排成最小的数 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 输入一个正整数数组, 把数组里所有数字拼接起来排成一个数, 打印能拼接出的所有数字中最小的一个. 大数转换为字符串, 重载快速排序的比较方法, 进行排序, 最后拼接. 代码: /* * main.cpp * * Created on: 2014.6.12 * Author: Spike */ /*eclipse cdt, gcc 4.8.1*/ #include <stdi

【面试题033】把数组排成最小的数

[面试题033]把数组排成最小的数 题目: 输入一个正整数数组,把数组里所有数字拼接起来排成一个数, 打印能拼接出的所有数字中最小的一个. 例如输入数组{3, 32, 321},则打印出这3个数字能排成的最小数字321323. 思路一: 最直观的想法是求出所有数字的全排列,然后取最小值即可, 根据排列组合的知识,n个数字总共有n!个排列. 思路二: 找到一个排序规则,数组根据这个规则排序之后能排成一个最小的数字. 给出一个规则,判断给出的两个 数字m和n,判断这两个数那个应该排在前面,而不是仅仅

把数组排成最小的数-剑指Offer

把数组排成最小的数 题目描述 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个.例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323. 思路 把两个int类型的数拼起来可能会比较大,溢出,我们可采用字符串来表示,处理大数问题 将数字转化为字符串,然后比较字符串的大小,此处的大小指的是:若str1+str2 > str2+str1,则str1 > str2, 我们需要重新定义一个compare函数 其实最后的连接起来的大小和

剑指offer 面试题33 把数组排成最小的数

题目链接: 剑指offer 题目链接: 把数组排成最小的数, 例如{3, 32, 321} 输出: 321323 解题思路: 我现在已经知道正确答案了, 就是没有办法去证明, 先去开会, 在开会的时候再去想. 代码: #include <iostream> #include <cstdio> #include <string> #include <vector> #include <cstring> #include <iterator&g

剑指offer (33) 把数组排成最小的数

题目:输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接处的所有数字中最小的一个 例如输入数组 {3, 32, 321}则打印这3个数字能排成的最小数字 321323 两个数字m和n能拼接成数字mn和nm,如果mn < nm,则打印出mn,也就是m排在n之前,我们定义此时 m 小于 n,也就是相当于 自定义了qsort排序的 函数指针 本题拼接数字可能超出表达范围,需用大数解决 int compare(const void* strNumber1, const void* str

微软算法100题68 用数组排成最小的数

68.把数组排成最小的数.题目:输入一个正整数数组,将它们连接起来排成一个数,输出能排出的所有数字中最小的一个.例如输入数组{32, 321},则输出这两个能排成的最小数字32132.请给出解决问题的算法,并证明该算法 1 package com.rui.microsoft; 2 3 import java.util.Arrays; 4 import java.util.Comparator; 5 6 public class Test68_Minimum { 7 8 public static

剑指Offer面试题33(java版):把数组排成最小的数

题目:输入一个正整数数组,把数组里面所有的数字拼接排成一个数,打印能拼接出的所有数字中的一个.例如输入数组{3,32,321},则打印出这3个数字能排成的最小数字321323. 这个题目最直接的做法应该是先求出这个数组中的所有数字的全排列,然后把每个排列拼接起来,最后求出排列起来的数字的最小值.求数组的排列和面试题28非常相似.根据排列组合的只是,n个数字总共有n!排列,我们再来看一下更快的算法. 这道题其实希望我们能够找到一个排序规则,数组根据这个规则排序之后能排成一个最小的数字.要确定排序的