剑指Offer-39.把数组排成最小的数(C++/Java)
题目:
输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
分析:
将数组元素按照特定的规则从小到大排列,最后遍历数组拼接字符串即可,但重点是什么样的规则。
在比较3和321的大小时,我们希望得到321小于3,这样拼接出来的数字3213是要小于3321,所以两个数字a和b比较大小时,将它们转换成字符串形式拼接成ab和ba来比较,ab小于ba则a小于b,根据这样的规则,将数组重新进行排序,最后拼接起来便是最小的数字了。
程序:
C++
class Solution { public: string PrintMinNumber(vector<int> numbers) { if(numbers.size() == 0) return ""; sort(numbers.begin(), numbers.end(), cmp); string res = ""; for(auto i:numbers) res += to_string(i); return res; } static bool cmp(int a, int b){ string strA = "" + to_string(a) + to_string(b); string strB = "" + to_string(b) + to_string(a); return strA < strB; } };
Java
import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; public class Solution { public String PrintMinNumber(int [] numbers) { String res = ""; for(int i = 0; i < numbers.length; i++){ list.add(numbers[i]); } Collections.sort(list,new Comparator<Integer>(){ public int compare(Integer str1, Integer str2) { String s1 = "" + str1 + str2; String s2 = "" + str2 + str1; return s1.compareTo(s2); } }); for(int j:list){ res += j; } return res; } private ArrayList<Integer> list=new ArrayList<>(); }