题目描述
输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
思路:这个题实际是考的字符串比大小,字符串是如何比大小?
1 .如果字符串相等返回值为0,不等返回其他数值。
比较方法是先比较对应字符的大小(Ascall吗顺序),从第一个字母开始比较。
2.如果第一个字符和参数的第一个字符不等,结束比较,返回他们之间的差值(ascii码值)
(负值前字符串的值小于后字符串,正值前字符串大于后字符串)
3.如果第一个字符和参数的第一个字符相等,则以第二个字符和参数的第二个字符做比较,
以此类推,直至比较的字符或被比较的字符有一方全比较完,这时就比较字符的长度.
我们这里用到的是 第1个:334和3331谁大? 从第一位一直到第三位比较“4>3”故,“334”>“3331”,
程序验证如下:
public class test_2 {public static void main(String[] args) {// TODO Auto-generated method stubString str_1="334";String str_2="3331";//如果相等则返回0,System.out.println(pareTo(str_2));}}
结果:
我们可以看到,334比3331大1.那么我们就可以做下面这道题了,其实就是比较两个字符串的连接大小
list.sort((a,b)->(a+""+b).compareTo(b+""+a));
上面这句话的意思是,重写list的sort方法:比如 3 32 321 就是做这样一个事,
32132<32321,所以将 321 放在 32 的前面 ,------ 3 321 32
3213<3321 ,所以将 321 放在 3 的前面,------ 321 32 3
以此类推:
package offer_java;import java.util.ArrayList;import java.util.List;/*输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。*/public class PrintMinNumber {static String PrintMinNumber(int [] numbers) {if (numbers.length==0|| numbers ==null) {return "";}List<Integer> list=new ArrayList<>();for(int a:numbers) {list.add(a);}list.sort((a,b)->(a+""+b).compareTo(b+""+a));StringBuffer stringBuffer=new StringBuffer();for(int a:list) {stringBuffer.append(a);}return stringBuffer.toString();}public static void main(String[] args) {// TODO Auto-generated method stubint [] numbers= {3,32,321};System.out.println(PrintMinNumber(numbers));}}
下面是list.sort的源码:
//从小到大的排序list.Sort(delegate(int a, int b){return pareTo(b);});//从大到小的排序list.Sort((a, b) =>pareTo(a)); //lamda expression
这种方式适合于字符串等许多类型的排序!
剑指offer_33:输入一个正整数数组 把数组里所有数字拼接起来排成一个数 打印能拼接出的所有数字中最小的一个。例如输入数组{3 32 321} 则打印出这三个数字能排成的最小数字为321323。