题:https://leetcode.com/problems/largest-number/description/
题目
Given a list of non negative integers, arrange them such that they form the largest number.
*Example 1:
Input: [10,2]
Output: "210"
Example 2:
Input: [3,30,34,5,9]
Output: "9534330"
Note: The result may be very large, so you need to return a string instead of an integer.
思路
题目大意
将 nums 中的数 组合生成一个字符串,字符串最大。
解题思路
两步:
- 将nums 排序。
- 将新排序的nums,组成一个字符串。
这里主要的难点在 排序。
两种方法:
1.将 str_a,str_b 。组合生成新的直接比较。
2.利用数学关系式,生成结果。
code
1.将 str_a,str_b 。组合生成新的直接比较。
class Solution {
public String largestNumber(int[] nums) {
if(nums == null || nums.length == 0)
return null;
String[] str = new String[nums.length];
for(int i = 0 ;i < nums.length;i++){
str[i] = String.valueOf(nums[i]);
}
Arrays.sort(str, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
String leftRight = o1 + o2;
String rightLeft = o2 + o1;
return -leftRight.compareTo(rightLeft);
}
});
StringBuffer sb = new StringBuffer();
for(String s:str){
sb.append(s);
}
while(sb.charAt(0) == '0' && sb.length() > 1 )
sb.deleteCharAt(0);
return sb.toString();
}
}
import functools
def cmpele(a, b):
stra = str(a)
strb = str(b)
stra_len = len(stra)
strb_len = len(strb)
max_len = max(stra_len, strb_len)
i = 0
while i < max_len:
if i < stra_len:
sa = int(stra[i])
elif i == stra_len:
sa = max(int(stra[0]), int(stra[i-1]))
if i < strb_len:
sb = int(strb[i])
elif i == strb_len:
sb = max(int(strb[0]), int(strb[i-1]))
if sa > sb:
return -1
elif sa < sb:
return 1
i += 1
return 0
class Solution:
def largestNumber(self, nums):
"""
:type nums: List[int]
:rtype: str
"""
nums = sorted(nums,key=functools.cmp_to_key(cmpele))
res = ""
for ele in nums:
res += str(ele)
while len(res) > 1 and res[0] == '0':
res = res[1:]
return res