您的位置:首页 > Web前端

剑指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,则返回负数
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐