剑指 Offer 45. 把数组排成最小的数
输入一个非负整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。
示例 1:
输入:[10,2]
输出: "102"
示例 2:
输入:[3,30,34,5,9]
输出: "3033459"
第一种:快速排序(更改排序方式)
class Solution { 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]); } quickSort(strs,0,strs.length - 1); StringBuilder res = new StringBuilder(); for(String s:strs){ res.append(s); } return res.toString(); } public void quickSort(String[] args,int l,int r){ if(l >= r)return; int i = l,j = r; while(i < j){ while((args[j]+args[l]).compareTo(args[l]+args[j]) >= 0 && i < j)j--; while((args[i]+args[l]).compareTo(args[l]+args[i]) <= 0 && i < j)i++; swap(args,i,j); } swap(args,i,l); quickSort(args,l,i-1); quickSort(args,i+1,r); } public void swap(String[] argss,int x,int y){ String temp ; temp = argss[y]; argss[y] = argss[x]; argss[x] = temp; } }
知识点:
如何将字符串数组改为字符串
StringBuilder res = new StringBuilder();//StringBuilder类型
for(String s:strs){
res.append(s); }
res.toString();//转为字符串类型
写交换函数时不能写成
public void swap(int x,int y)
因为这样改的只是形参而非数组中实参。
String.valueOf()//转为String函数
compareTo() 方法用于将 Number 对象与方法的参数进行比较。可用于比较 Byte, Long, Integer等。
该方法用于两个相同数据类型的比较,两个不同类型的数据不能用此方法来比较。
-
如果指定的数与参数相等返回0。
-
如果指定的数小于参数返回 -1。
-
如果指定的数大于参数返回 1。
方法二:内置函数排序
class Solution { 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]); } Arrays.sort(strs,(x,y)->(x+y).compareTo(y+x)); StringBuilder res = new StringBuilder(); for(String s:strs){ res.append(s); } return res.toString(); }