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.
这题也是属于那种算法很重要的那种题目,一开始拿到题目我头都大了,想想怎么样才能够正确的分析出来哪个比哪个大种种情况,后来实在想不出来,看了下别人写的,原来可以是暴力
一点,直接对每个组合组成的数字进行比较(当然是两个两个数字之间),然后排个序,直接相加得到的就是最大的数了。代码如下,实现比较容易:
1 class Solution { 2 public: 3 string largestNumber(vector<int>& nums) { 4 stringstream ss; 5 vector<string> numStr; 6 numStr.clear(); 7 ss.str(""); 8 int sz = nums.size(); 9 for(int i = 0; i < sz; ++i){ 10 ss << nums[i]; 11 numStr.push_back(ss.str()); 12 ss.str(""); //清空ss 13 } 14 sort(numStr.begin(), numStr.end(), Compare); 15 string ret = ""; 16 for(int i = 0; i < sz; ++i){ 17 ret += numStr[i]; 18 } 19 if(ret[0] == '0') 20 ret = "0"; 21 return ret; 22 } 23 24 static bool Compare(string s1, string s2) 25 { 26 string res1 = s1 + s2; 27 string res2 = s2 + s1; 28 return res1 > res2; 29 } 30 };
java版本的如下所示,由于String的处理比较方便,可以直接的将Int型转换成一个String,Comparator对象使用起来也较为容易,代码如下所示:
1 public class Solution { 2 public String largestNumber(int[] nums) { 3 int sz = nums.length; 4 String [] numStr = new String[sz]; 5 for(int i = 0; i < sz; ++i){ 6 numStr[i] = String.valueOf(nums[i]); 7 } 8 Arrays.sort(numStr, new Comparator<String>(){ //这里就不用单独的去创造一个函数对象了,直接new一个使用就可以了 9 public int compare(String s1, String s2){ 10 String tmp1 = s1+s2; 11 String tmp2 = s2+s1; 12 return tmp2.compareTo(tmp1); 13 } 14 }); 15 String ret = new String(""); 16 for(int i = 0; i < sz; ++i){ 17 ret += numStr[i]; 18 } 19 if(ret.charAt(0) == '0') 20 ret = "0"; 21 return ret; 22 } 23 }