来自leetcode的最大数字:有人可以解释为什么这种方法有效吗?

时间:2015-03-06 13:24:15

标签: c++ algorithm sorting

此处the question from leetcode

  

给定一个非负整数列表,将它们排列成它们   形成最大的数字。

     

例如,给定[3,30,34,5,9],最大的形成数是   9534330。

这是我见过的最简单的解决方案:

class Solution {
public:
    string largestNumber(vector<int> &num) {
        vector<string> arr;
        for(auto i:num)
            arr.push_back(to_string(i));
        sort(begin(arr), end(arr), [](string &s1, string &s2){ return s1+s2>s2+s1; });
        string res;
        for(auto s:arr)
            res+=s;
        while(res[0]=='0' && res.length()>1)
            res.erase(0,1);
        return  res;
    }
};

我很困惑,为什么这种方法有效。可以有人对这种方法进行证明吗?

2 个答案:

答案 0 :(得分:0)

首先要注意的是,您使用向量的所有元素形成的每个数字都具有相同的位数。这就是我们可以在字符串上使用词典排序的原因。

所以我们能够以天真的方式做的就是列出所有的posibile连接并从中选择最大的连接。

用于排序的字符串比较利用上述事实来处理向量中2个元素的特殊情况。所以我们可以修改天真的实现,首先使用这个比较器搜索最大的元素,连接它们然后用一个大小减少了1的向量重复(新的连接元素也包含在新的向量中)。但话说回来,我们会选择新的连接元素和剩余的最大元素。如果我们不选择新的连接元素,那么我们首先不会选择向量的2个最大元素。所以我们按递减顺序逐个挑选元素。这就是首先应用排序的原因。

答案 1 :(得分:0)

您必须对所有可能的数组成员组合进行greate。 例如3303459,9534303,9353430,93534303,.... 所以,首先你必须在一个字符串中组合之后对它们进行排序。 对于排序你不能只比较3和30,你必须将它们的合并值303与330进行比较, 如果你只检查30和3的成员,你将有303,但实际上在这个比较中你应该有330,因为330&gt; 303,这就是为什么要将<!DOCTYPE html> <html> <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.8/angular.min.js"></script> <body ng-app="myApp"> <table ng-controller="myCtrl" border="1"> <tr> <td>Amt</td> <td>Balance</td> <td>Entered Amt</td> </tr> <tr ng-repeat="x in records"> <td>{{x.Amt}}</td> <td>{{x.balance}}</td> <td><input type="text" ng-model="d" ng-change="value(d, x)"></td> </tr> </table> </body> </html>s1 + s2进行比较,

关于while循环,可能是suck测试用例[0,0,0,0],对于这种情况会产生这样的字符串“0000”,但它不是正常的数字,我们必须删除从左边开始的所有0一,得到正常数字“0”