https://leetcode-cn.com/problems/ba-shu-zu-pai-cheng-zui-xiao-de-shu-lcof/
题目描述
输入一个非负整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。
提示:
0 < nums.length <= 100
说明:
- 输出结果可能非常大,所以你需要返回一个字符串而不是整数
- 拼接起来的数字可能会有前导 0,最后结果不需要去掉前导 0
输入输出样例
输入: [3,30,34,5,9]
输出: "3033459"
题解
- 将数字转换成字符串是明智的选择,这一步可以想出来。
- 之后就是将两个字符串进行比较(这一步特别关键)
- 如果是两个字符串直接进行比较,非常复杂(一个长一个短)…
- 好的做法:
A字串和B字串进行比较大小。
不直接进行比较,而是 (A+B) 和 (B+A)进行比较
这样可以比较出来,A和B字符串哪个比较比较小
代码:
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]);
}
// 使用工具类的排序方法
Arrays.sort(strs, (s1,s2) -> (s1+s2).compareTo(s2+s1));
StringBuffer sb = new StringBuffer();
for(String str:strs){
sb.append(str);
}
return sb.toString();
}
}
使用数组 + 链表的方式
建立一个长度是10的数组。
将元素添加到Node数组中的时候,如果数组中已经有值了,就使用链表的方式存储,否则使用数组下标的方式存储数据。
class Node{
String val;
Node next;
public Node(String val){
this.val = val;
}
}
class Solution {
public String minNumber(int[] nums) {
Node[] nodes = new Node[10];
for(int num:nums){
// 将每个数字转换成字符串
String str = num+"";
// 放入Node数组中
put(nodes, str, Integer.parseInt(str.charAt(0)+""));
}
StringBuffer sb = new StringBuffer();
for(Node node:nodes){
while(node != null){
sb.append(node.val);
node = node.next;
}
}
return sb.toString();
}
public void put(Node[] nodes, String str, int index){
// 如果没有值,直接将节点放在数组下标处
if(nodes[index] == null){
nodes[index] = new Node(str);
}
// 如果有值
else{
Node node = nodes[index];
while(node != null){
String nodeStr = node.val;
// 如果node字符串比当前字符串小
if((nodeStr+str).compareTo(str+nodeStr) < 0){
if(node.next == null){
node.next = new Node(str);
break;
}
node = node.next;
}
// 如果node字符串比当前字符串大
else{
// 添加 Node节点
node.val = str;
Node n = new Node(nodeStr);
n.next = node.next;
node.next = n;
break;
}
}
}
}
}