難度:中等
題目:
輸入一個(gè)非負(fù)整數(shù)數(shù)組,把數(shù)組里所有數(shù)字拼接起來(lái)排成一個(gè)數(shù),打印能拼接出的所有數(shù)字中最小的一個(gè)。
示例 1:
輸入: [10,2]
輸出: "102"
示例?2:
輸入: [3,30,34,5,9]
輸出: "3033459"
提示:
0 < nums.length <= 100
說(shuō)明:
輸出結(jié)果可能非常大,所以你需要返回一個(gè)字符串而不是整數(shù)
拼接起來(lái)的數(shù)字可能會(huì)有前導(dǎo) 0,最后結(jié)果不需要去掉前導(dǎo) 0
來(lái)源:力扣(LeetCode)
解答:
?public?String?minNumber(int[]?nums)?{
????????String[]?strs?=?new?String[nums.length];
????????for(int?i?=?0;?i?<?nums.length;?i++)
????????????strs[i]?=?String.valueOf(nums[i]);
????????fastSort(strs,?0,?strs.length?-?1);
????????StringBuilder?res?=?new?StringBuilder();
????????for(String?s?:?strs)
????????????res.append(s);
????????return?res.toString();
????}
????void?fastSort(String[]?strs,?int?l,?int?r)?{
????????????if(l?>=?r)?return;
????????????int?i?=?l,?j?=?r;
????????????String?tmp?=?strs[i];
????????????while(i?<?j)?{
????????????????while((strs[j]?+?strs[l]).compareTo(strs[l]?+?strs[j])?>=?0?&&?i?<?j)?j--;
????????????????while((strs[i]?+?strs[l]).compareTo(strs[l]?+?strs[i])?<=?0?&&?i?<?j)?i++;
????????????????tmp?=?strs[i];
????????????????strs[i]?=?strs[j];
????????????????strs[j]?=?tmp;
????????????}
????????????strs[i]?=?strs[l];
????????????strs[l]?=?tmp;
????????????fastSort(strs,?l,?i?-?1);
????????????fastSort(strs,?i?+?1,?r);
???????}
更改了快速排序的方法,改變了排序規(guī)則,比較了兩個(gè)字符串拼接之后的大小,然后更改字符串組,來(lái)完成題目要求的。