给定一个非负整数列表,将它们排列成它们 形成最大的数字。
例如,给定[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;
}
};
我很困惑,为什么这种方法有效。可以有人对这种方法进行证明吗?
答案 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”