输入一个正整数数组,把数组里的所有数字拼接起来排成一个数,打印能拼接出的所有数字中最大的一个
例如输入数组 [3,32,321] ,则打印出这三个数字能排成最大的数字332321
package com.kuang.test;
import java.util.*;
public class TestArraySort {
//自动排序
private static Set<String> set = new TreeSet<>();
//输入的数组
private static String[] strings = new String[]{"3", "32", "321"};
public static void main(String[] args) {
// 开始 拼接
for (int i = 0; i < strings.length; i++) {
String insertStr = strings[i];
// 调用自定义拼接方法拼接字符串,并把拼接好字符串加入集合中
appendStr(insertStr, i, strings);
}
//展示数据
for (String num : set) {
System.out.println(num);
}
Iterator<String> iterator = set.iterator();
for (int i = 0; i < set.size() ; i++) {
String next = iterator.next();
if(i==set.size()-1){
System.out.println("最大的数字是 = " + next);
break;
}
}
}
// 三个参数
// ①插入的字符串(未拼接完成的字符串)
// ②要删除的 上次循环已经参与拼接的字符的下标
// ③留下的未参与拼接的数组
public static void appendStr(String insertStr, int index, String[] prevString) {
//未参与拼接的字符串
String[] notJoinString;
//如果数组只有最后一个值,那么直接赋值
if (prevString.length == 1) {
notJoinString = new String[]{prevString[0]};
}
//否则,【祛除】已经拼接的值,返回一个新的数组
else {
notJoinString = new String[prevString.length - 1];
for (int i = 0; i < prevString.length; i++) {
if (i < index) {
notJoinString[i] = prevString[i];
}
if (i > index) {
notJoinString[i - 1] = prevString[i];
}
}
}
for (int i = 0; i < notJoinString.length; i++) {
// 把未被拼凑的字符 拼凑到上一次拼接好的字符串后
String nextInsertStr = insertStr + notJoinString[i];
// 递归开始……
// 直到拼接完成,产生一个完整的字符串(这里是一轮递归的出口)
if (notJoinString.length != 1) {
appendStr(nextInsertStr, i, notJoinString);
} else {
set.add(nextInsertStr);
}
}
}
}