zoukankan      html  css  js  c++  java
  • 把数组排成最小的数

    题目:输入一个正整数数组,把数组里面所有数字拼接起来排成一个数,打印能拼接出的所有数字钟最小的一个。例如:输入数组{3,,32,321} ,则打印出来的最小数是321323.

    分析:这里一个需要注意的是,组成的数有可能溢出,所以这是一个大数问题。对于大数问题,我们又想到不能直接这么组成一个数字,可以采用字符串,也就是先转换成字符串,再进行比较,strcmp()。

            还有个问题就是,我们不采用全排列组合,我们可以对字符进行一个排序。排序的时候,有个比较,而这个比较是这样的比较:ab 与ba的比较,而不是单纯的 a和b 比较,因为ab ba长度是一样的 只需要调用字符串比较的函数比较就行。 比较的时候,还可以用这个方法:假如是a,b,c组合,可以先是ab和ba的比较,假如ba>ab,那么接下来,将c插入进去,如 bac,bca,aba,插入排序。

    代码如下:

    //重新定义比较函数对象
    struct compare
    {
        bool operator() (const string &src1, const string &src2)   //重新定义()
        {
            string s1 = src1 + src2;
            string s2 = src2 + src1;
            return s1 < s2;   //升序排列,如果改为s1 > s2则为逆序排列
        }
    };
    //函数功能 : 把数组排成最小的数
    //函数参数 : pArray为数组,num为数组元素个数  
    //返回值 :   无
    void ComArrayMin(int *pArray, int num)
    {
        int i;
        string *pStrArray = new string[num];
    
        for(i = 0; i < num; i++) //将数字转换为字符串
        {    
            stringstream stream;
            stream<<pArray[i];
            stream>>pStrArray[i];
        }
    
        sort(pStrArray, pStrArray + num, compare()); //字符串数组排序
    
        for(i = 0; i < num; i++) //打印字符串数组
            cout<<pStrArray[i];
        cout<<endl;
    
        delete [] pStrArray;
    }

    参考:http://blog.csdn.net/wuzhekai1985/article/details/6704902

  • 相关阅读:
    ASP.NET MVC3 的一个OutputCache问题
    好用的服务器软件安装工具
    IO(五)----打印流
    HDU 5873 Football Games 【模拟】 (2016 ACM/ICPC Asia Regional Dalian Online)
    HDU 5874 Friends and Enemies 【构造】 (2016 ACM/ICPC Asia Regional Dalian Online)
    HDU 5876 Sparse Graph 【补图最短路 BFS】(2016 ACM/ICPC Asia Regional Dalian Online)
    makefile编写_简单
    3.6.3 不可变字符串
    使用VisualStudio进行脚本|样式文件压缩
    Java笔记--网络编程
  • 原文地址:https://www.cnblogs.com/menghuizuotian/p/3819311.html
Copyright © 2011-2022 走看看