zoukankan      html  css  js  c++  java
  • Largest Number

    Total Accepted: 35377 Total Submissions: 202492 Difficulty: Medium

    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.

    关键在于定义一种新的字符串比较规则,使得我们把排序好的字符串数组串一遍就能得到结果。

    新的比较规则是return  s1+s2 < s2+s1;

    然后证明这种比较规则为什么是对的。

    证明:
    假设按这种规则排序好的数组是:A1,A2,A3...Ax....Ay.....An

    根据这种排序规则,最后的排序结果是An...AyAy-1...Ax...A3A2A1

    反证法证明:

    假设存在一个An...AxAy-1...Ay...A3A2A1 > An...AyAy-1...Ax...A3A2A1

    由于Ax<Ax+1<Ax+2<Ax+3<....<Ay-1<Ay 

    那么An...Ay Ay-1... Ax+2 Ax+1 Ax...A3 A2 A1 > An...AyAy-1...Ax Ax+1...A3A2A1,这是根据比较规则来的,比较规则中,若Ax<Ax+1则AxAx+1 < Ax+1Ax

    同样An...AyAy-1...Ax Ax+1...A3A2A1 > An...AyAy-1...Ax Ax+2 Ax+1...A3A2A1>...>An...Ax Ay Ay-1...Ax+2 Ax+1...A3A2A1。

    同理可以证明An...Ax Ay Ay-1...Ax+2 Ax+1...A3A2A1>An...Ax Ay-1...Ax+1 Ay...A3A2A1。

    这就与假设相反,所以得证

    bool comp(const string& lhs,const string& rhs){
        return lhs+rhs < rhs+lhs;
    }
    class Solution {
    public:
        string largestNumber(vector<int>& nums) {
            vector<string> str_nums;
            //以下三种整数转字符串
            /*1.
            for(auto num:nums){
                char buf[20]={0};
                sprintf(buf,"%d",num);
                str_nums.push_back(string(buf));
            }
            */
            /*2.
            vector<string> str_nums(nums.size());
            stringsteam stream;
            for(auto num:nums){
                stream<<num;
                stream>>str_nums[i];
                str_nums.push_back(string(buf));
            }
            */
            for(auto num:nums){
                str_nums.push_back(to_string(num));
            }
            sort(str_nums.begin(),str_nums.end(),comp);
            string res;
            for(int i=str_nums.size()-1;i>=0;i--){
                res.append(str_nums[i].begin(),str_nums[i].end());
            }
            return (res.empty() || res[0]!='0' )?  res : "0";
        }
    };
  • 相关阅读:
    2017-2018-1 20155225 《信息安全系统设计基础》第三周学习总结
    2017-2018-1 20155225 《信息安全系统设计基础》第2周课堂实验
    20155225 2017-2018-1 《信息安全系统设计基础》第一周学习总结
    课堂实践——数据库
    20155225 2016-2017-2《Java程序设计》课程总结
    20155225 实验五《网络编程与设计》实验报告
    20155225 实验四《Android程序设计》实验报告
    转载
    HDU
    SCU
  • 原文地址:https://www.cnblogs.com/zengzy/p/5047263.html
Copyright © 2011-2022 走看看