剑指offer - 把数组排成最小的数(Java实现)
思路一:可以对这个数组进行一个全排列,然后对于每一种情况我们可以进行合并,然后从所有的全排列中找到一种最小值。全排列思路:https://blog.nowcoder.net/n/5f718ef899bf4cea924eeb2bf60fce03。
import java.util.*;
public class Solution {
static String ans = "";//全局静态变量记录答案
public String PrintMinNumber(int [] numbers) {
if(numbers.length == 0) return "";
int n = numbers.length;
String[] strs = new String[n];
for(int i = 0; i < n; ++ i) {
strs[i] = numbers[i] + "";
}
Permutation(0, strs);
return ans;
}
public static void Permutation(int n, String[] strs) {
if(n == strs.length) {//某种情况成立
StringBuilder temp = new StringBuilder();
for(int i = 0; i < n; ++ i) temp.append(strs[i]);
if(ans.length() != temp.length()) ans = temp.toString();
if(ans.compareTo(temp.toString()) > 0) {
ans = temp.toString();
}
return ;
}
for(int i = n; i < strs.length; ++ i) { //全排列
Swap(n, i, strs);
Permutation(n + 1, strs);
Swap(n, i, strs);
}
}
public static void Swap(int x, int y, String[] strs) {
String temp = strs[x];
strs[x] = strs[y];
strs[y] = temp;
}
} 思路二:对于这个数组,我们可以按照某种规则进行排序,即:number1 + number2 < number2 + number1,在证明的时候,我们可以任意颠倒两个数字的位置
按照我们的排序规则则有, 所以我们的排序规则是成立的。
import java.util.*; public class Solution { public String PrintMinNumber(int [] numbers) { ArrayList<String> list = new ArrayList<>(); for(int val : numbers) { //首先将数组转换为list list.add(val + ""); } Collections.sort(list, new Comparator<String>() {//对list进行排序 public int compare(String s1, String s2) { return (s1 + s2).compareTo(s2 + s1); } }); StringBuilder ans = new StringBuilder(); for(String str : list) {//直接拼接答案 ans.append(str); } return ans.toString(); } }
【剑指offer】题目全解 文章被收录于专栏
本专栏主要是刷剑指offer的题解记录
