1. 最小数
此题求拼接起来的最小数字,本质上是一个排序问题。设数组 nums 中任意两数字的字符串为 x 和 y ,则规定 排序判断规则 为:
若拼接字符串 x + y > y + x,则 x “大于” y ;
反之,若 x + y < y + x,则 x “小于” y ;
x “小于” y 代表:排序完成后,数组中 x 应在 y 左边;“大于” 则反之。
(1)Arrays.sort()
class Solution {
public String minNumber(int[] nums) {
String[] strs = new String[nums.length];
for (int i = 0; i < nums.length; i++) {
strs[i] = String.valueOf(nums[i]);
}
//对x,y进行排序(升序排列即为最小)
Arrays.sort(strs, (x, y) -> (x + y).compareTo(y + x));
//输出
StringBuilder res = new StringBuilder();
for (String s : strs) {
res.append(s);
}
return res.toString();
}
}
(2)快排
class Solution {
public String minNumber(int[] nums) {
String[] strs = new String[nums.length];
for (int i = 0; i < nums.length; i++) {
strs[i] = String.valueOf(nums[i]);
}
//对x,y进行排序
//Arrays.sort(strs, (x, y) -> (x + y).compareTo(y + x));
quickSort(strs, 0, str.length - 1);
//输出
StringBuilder res = new StringBuilder();
for (String s : strs) {
res.append(s);
}
return res.toString();
}
public void quickSort(String[] str, int left, int right) {
if (left >= right)
return;
int i = left, j = right;
//取最左边节点为哨兵,哨兵为left
while(i < j) {
//从右往左,找到第一个比哨兵小的节点
while(i < j && (str[j] + str[left]).compareTo(str[left] + str[j]) >= 0)
j--;
//从左往右,找到第一个比哨兵大的节点
while(i < j && (str[i] + str[left]).compareTo(str[left] + str[i]) <= 0)
i++;
//交换
swap(str, i, j);
}
//交换i,j相交的i节点 与 哨兵节点
swap(str, i, left);
//继续递归左右子序列
quickSort(str, left, i - 1);
quickSort(str, i + 1, right);
}
public void swap(String[] str, int i, int j) {
String temp;
temp = str[i];
str[i] = str[j];
str[j] = temp;
}
}
2. 最大数![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/476a7af40586c7fca49a3829999d2b34.png)
(1)排序
需判断 如果输入多个0应该如何处理
class Solution {
public String largestNumber(int[] nums) {
String[] strs = new String[nums.length];
for (int i = 0; i < nums.length; i++) {
strs[i] = String.valueOf(nums[i]);
}
//对x,y进行排序(降序排列)
Arrays.sort(strs, (x, y) -> (y + x).compareTo(x + y));
//输出
StringBuilder res = new StringBuilder();
for (String s : strs) {
res.append(s);
}
//需要排除有多个0的情况
int k = 0;
while (k < nums.length - 1 && res.charAt(k) == '0')
k++;
return res.substring(k); //截取从k开始到结尾处
}
}
(2)手写快排
class Solution {
public String largestNumber(int[] nums) {
String[] strs = new String[nums.length];
for (int i = 0; i < nums.length; i++) {
strs[i] = String.valueOf(nums[i]);
}
//对x,y进行排序(降序排列)
quickSort(strs, 0, nums.length - 1);
//输出
StringBuilder res = new StringBuilder();
for (String s : strs) {
res.append(s);
}
int k = 0;
while (k < nums.length - 1 && res.charAt(k) == '0')
k++;
return res.substring(k);
}
public void quickSort(String[] str, int left, int right) {
if (left >= right)
return;
int i = left, j = right;
//取最左边节点为哨兵,哨兵为left
while(i < j) {
//从右往左,找到第一个比哨兵小的节点
while(i < j && (str[left] + str[j]).compareTo(str[j] + str[left]) >= 0)
j--;
//从左往右,找到第一个比哨兵大的节点
while(i < j && (str[left] + str[i]).compareTo(str[i] + str[left]) <= 0)
i++;
//交换
swap(str, i, j);
}
//交换i,j相交的i节点 与 哨兵节点
swap(str, i, left);
//继续递归左右子序列
quickSort(str, left, i - 1);
quickSort(str, i + 1, right);
}
public void swap(String[] str, int i, int j) {
String temp;
temp = str[i];
str[i] = str[j];
str[j] = temp;
}
}