剑指offer30--将数组排列成最小的数
2016-06-16 13:43
375 查看
题目:输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。
例子说明:例如输入数组{3, 32, 321},则扫描输出这3 个数字能排成的最小数字321323。
编程思想:(1)找到一个排序的规则,这个规则不是简单的比较两个数的大小,比如321和33,我们应该把321放到前面,而不是将数字比较小的33放到前面。根据这个规则创建一个比较器。
(2)使用上面创建的比较器来对数组进行排序,也就是将该放到前面的数字放到前面。在这里我们使用的是快速排序的方式来排序的。
(3)通过StringBuider Builder的append的方法来将字符串相连
注意问题:String中compareTo()方法进行了重写,所以我们可以直接使用。
package 剑指offer; import java.util.*; /*题目:输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。*/ public class Test33 { //定义一个比较特殊的比较器,用来比较mn和nm的大小 public static class MComparator implements Comparator<String>{ public int compare(String str1, String str2){ if(str1 == null || str2 == null){ throw new IllegalArgumentException("Not Null"); } String s1 = str1 + str2; String s2 = str2 + str1; return s1.compareTo(s2); } } /** * 快速排序算法 * * @param array 待排序数组 * @param start 要排序的起始位置 * @param end 要排序的结束位置 * @param comparator 自定义的比较器 */ public static void quickSort(String ary[], int start, int end, Comparator<String> comparator){ if(start < end){ String strFlag = ary[start]; int left = start; int right = end; while(start < end){ while(start < end && comparator.compare(ary[end], strFlag) >= 0){ end--; } ary[start] = ary[end]; while(start < end && comparator.compare(ary[start], strFlag) <= 0){ start++; } ary[end] = ary[start]; // 如此循环往复 } ary[start] = strFlag; quickSort(ary, left, start - 1, comparator); quickSort(ary, start + 1, right, comparator); } } public static String printMinNumber(String[] array) { if (array == null || array.length < 1) { throw new IllegalArgumentException("Array must contain value"); } MComparator comparator = new MComparator(); quickSort(array, 0, array.length - 1, comparator); StringBuilder builder = new StringBuilder(256); for (String s : array) { builder.append(s); } return builder.toString(); } public static void main(String args[]){ String[] data = {"3", "5", "1", "4", "2"}; System.out.println(printMinNumber(data)); String[] data2 = {"3", "32", "321"}; System.out.println(printMinNumber(data2)); } }
s1.compareTo(s2)中如果s1<s2,则返回负数
相关文章推荐
- js中的小数计算精度问题,修正计算精度
- ButterKnife详解
- 19. Remove Nth Node From End of List [easy] (Python)
- 在div宽高不确定的情况下,使其居中[轮播图点击按钮常用]——前端工程师和派孔明
- JS控制图片按比例缩放并不超过一定宽度和高度(居中对齐)
- Hadoop-2.4.1源码分析--HDFS HeartBeat(心跳检测)之NameNode端处理数据块增量汇报
- 低版本jQuery在Firefox中运行不正确的解决
- JavaScript DOM 制作搜索框,outline 去掉文本框获取焦点时候的颜色
- JavaScript DOM 制作搜索框,outline 去掉文本框获取焦点时候的颜色
- JavaScript DOM 制作搜索框,outline 去掉文本框获取焦点时候的颜色
- JavaScript DOM 制作搜索框,outline 去掉文本框获取焦点时候的颜色
- JavaScript DOM 制作搜索框,outline 去掉文本框获取焦点时候的颜色
- JavaScript DOM 制作搜索框,outline 去掉文本框获取焦点时候的颜色
- JavaScript DOM 制作搜索框,outline 去掉文本框获取焦点时候的颜色
- JavaScript DOM 制作搜索框,outline 去掉文本框获取焦点时候的颜色
- JavaScript DOM 制作搜索框,outline 去掉文本框获取焦点时候的颜色
- JavaScript DOM 制作搜索框,outline 去掉文本框获取焦点时候的颜色
- JavaScript DOM 制作搜索框,outline 去掉文本框获取焦点时候的颜色
- JavaScript DOM 制作搜索框,outline 去掉文本框获取焦点时候的颜色
- JavaScript DOM 制作搜索框,outline 去掉文本框获取焦点时候的颜色