刚开始的想法,是觉得这题没法直接得出每个数字的具体“大小”,我的做法是:
1 ——> (1111111111,1) 234 ——> (234444444,4)
然后直接在nums对元组中的第一个元素用sort,在样例中卡住了,最后换了题解。
本题两个关键点:
- 直接比较两个数字相连的结果,确定其排序(没想到)
- 在python和Java中的sort方法中传入比较方法。(get)
- python2
compare = lambda x, y: 1 if x+y > y+X else -1 nums.sort(com = compare)
- python3
import functools # 将nums中的每个元素映射成str,再转化成list numsStr = list(map(str, nums)) compare = lambda x,y: 1 if x+y<y+x else -1 numsStr.sort(key = functools.cpm_to_key(compare)) res=''.join(nums_str) if res[0]=='0': res='0' return res
- Java
int n = nums.length; String numsToWord[] = new String[n]; for(int i=0;i<n;i++){ numsToWord[i] = String.valueOf(nums[i]); } //compareTo()方法比较的时候是按照ASCII码逐位比较的 //通过比较(a+b)和(b+a)的大小,就可以判断出a,b两个字符串谁应该在前面 //所以[3,30,34]排序后变为[34,3,30] //[233,23333]排序后变为[23333,233] Arrays.sort( numsToWord,(a,b)->{ return (b+a).compareTo(a+b); } ); if(numsToWord[0] == "0"){ return "0"; } StringBuilder sb = new StringBuilder(); for(int i=0;i<n;i++){ sb.append(numsToWord[i]); } return sb.toString();
- python2