• <LeetCode OJ> 179. Largest Number


    Given a list of non negative integers, arrange them such that they form the largest number.

    For example, given [3, 30, 34, 5, 9], the largest formed number is 9534330.

    Note: The result may be very large, so you need to return a string instead of an integer.



    分析:

    思路首先:为了能凑成最大数,开头大的数成为新数的起始位。同一时候题目说了是排序问题
    那么显然我们应该依照"字典"顺序来排数可是我们又不能简单的依照字典顺序,
    举例:[3, 30, 34, 5, 9]已经是字典顺序了,可是“最大数”顺序应该为[30, 3, 34, 5, 9],所以9534330
    所以规则应该例如以下:
    给定两个非负整数:a, b
    将它们转换成字符串形式,然后进行连接。可得两种结果:
    a在前,b在后,记为:strAB
    b在前。a在后。记为:strBA
    假设strAB > strBA,那么排序时a在b的前面。

    class Solution {
    public:
        //不能简单的按字典序排序即小的在前面。  
        //比方32的字典序比322小,可是32322比32232大。  
        static  bool cmp(const string &str1, const string &str2)   //为什么这里要加一个static keyword才行???????
        {  
            string _str1 = str1;  
            string _str2 = str2;  
            _str1.append(str2);//在_str1后面追加str2字符串  
            _str2.append(str1);  
            return _str2 < _str1;//true则将对原字符串顺序颠倒,否则不处理  
        }
        string largestNumber(vector<int>& nums) {
            int len=nums.size();
            string strnum[1000];
            string result;
            if(len==0)
                return result;
            for (int i = 0; i < len; i++)   
                strnum[i] = to_string(nums[i]);   //将数字转换到strnum数组中  
            sort(strnum,strnum+len,cmp);    
            for (int i = 0; i < len; i++)   
                result.append(strnum[i]);   //将字符数字转换到结果字符串中
            auto pos = result.find_first_not_of('0');
            return pos == string::npos ?

    "0" : result.substr(pos); } };


    学习别人的代码,精炼.....:

    class Solution
    {
    public:
        string largestNumber(vector<int>& nums)
        {
            sort(nums.begin(), nums.end(), compare);//直接对数组进行自己定义的字典顺序“排序”
            string res;
            for (auto n : nums)
                res += to_string(n);
            auto pos = res.find_first_not_of('0');//找到第一个不为‘0’的位置
            return pos == string::npos ? "0" : res.substr(pos);//假设位置pos不存在(即全是‘0’)则返回‘0’,否则返回pos開始的子字符串
        }
    
    private:
        static bool compare(int a, int b)
        {
            auto strA = to_string(a);
            auto strB = to_string(b);
            return (strA + strB > strB + strA);
        }
    };



    本题參考曾经在九度写的代码:

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


    题目描写叙述:

    输入一个正整数数组。把数组里全部数字拼接起来排成一个数,打印能拼接出的全部数字中最小的一个。

    比如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。

    输入:

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

    输出:

    相应每一个測试案例,
    输出m个数字能排成的最小数字。

    例子输入:
    3
    23 13 6
    2
    23456 56
    例子输出:
    13236
    2345656
    #include "vector"    
    #include <iostream>    
    #include "algorithm"    
    #include<string>  
    #include <stdio.h>  
    #include<cmath>  
    #include<cstdlib>  
       
    using namespace std;  
       
     long long numbers[200];  
    string str_num[200];  
       
    //不能简单的按字典序排序即小的在前面。  
    //比方32的字典序比322小,可是32322比32232大,  
    bool cmp(const string &str1, const string &str2)   
    {  
        string _str1 = str1;  
        string _str2 = str2;  
        _str1.append(str2);//在_str1后面追加str2字符串  
        _str2.append(str1);  
        return _str1 < _str2;//true则将对原字符串顺序颠倒,否则不处理  
    }  
       
    int main() {  
        int n;  
        while (scanf("%d", &n) != EOF)   
        {  
            //接受输入  
            for (int i = 0; i < n; i++)  
                scanf("%d", numbers + i);  
       
            for (int i = 0; i < n; i++)   
            {  
                char str[20];  
                sprintf(str, "%d", numbers[i]);//将数字转换到str内存中  
                str_num[i] = str;  
            }  
       
            sort(str_num, str_num + n, cmp);  
       
            for (int i = 0; i < n; i++)   
                cout << str_num[i];  
               
            cout << endl;  
        }  
        return 0;  
    }  
    /**************************************************************  
        Problem: 1504  
        User: EbowTang  
        Language: C++  
        Result: Accepted  
        Time:220 ms  
        Memory:1524 kb  
    ****************************************************************/  


    注:本博文为EbowTang原创,兴许可能继续更新本文。

    假设转载。请务必复制本条信息。

    原文地址:http://blog.csdn.net/ebowtang/article/details/50511705

    原作者博客:http://blog.csdn.net/ebowtang

  • 相关阅读:
    Oracle 常用函数备查
    apt-get/dpkg常用指令备查
    vmware下虚拟机不能上网问题解决
    [转]JAVA并发编程学习笔记之Unsafe类
    solaris 下查看某程序所开端口
    java 守护线程
    Java实现非法访问异常
    Java使用ListIterator逆序ArrayList
    Java实现Map集合二级联动
    Java使用String类格式化当前日期
  • 原文地址:https://www.cnblogs.com/wgwyanfs/p/7123451.html
Copyright © 2020-2023  润新知