前言:想了半天,想了种思路,觉得完美,代码写出来后,一测试,通过,自信满满的去评论区,发现。。原来还有更好的办法,这就是满罐子不荡半罐子荡吗 哈~ 学无止境,但还是可开心 又凭自己的能力写出了个代码
- 题目:
输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
-
思路: 我的vs大佬们的
我的:数首字母越小的 越要放前面,所以我用冒泡排序的流程,比较各数字首字母的大小,再比较途中,如果发现首字母相同的,比如3,32,321,那么这里我突然想到了,把3扩充为333,32扩充为323,然后大家都是3位数了,比较大小,小的再前面(源于我不停的拼接这3个字符时,产生的灵感,实际上就是这样,有点无法言述)。然后排好序后,字符串一拼接就好了。
大佬们的:将数组转换为字符串,字符串拼接后比较大小,若字符串a+b小于字符串b+a,则a在前面。。。。。。然后逐一比较。。。怎么说呢,看完了后,觉得我在编程的路上走的尽是弯路。 -
待码:贴上我的弯路代码
package cn.test32;
import java.util.ArrayList;
import java.util.Collections;
public class test {
public static void main(String[] args){
int[] a={3,32,321,5,2};
Solution solution=new Solution();
;
System.out.println( solution.PrintMinNumber(a));
}
}
class Solution {
public String PrintMinNumber(int [] numbers) {
if(numbers.length==0) return "";
//把整数转换成字符串,并存储到arraylist里
ArrayList<String> arrayList=new ArrayList<String>();//
for(int i=0;i<numbers.length;i++){
arrayList.add(String.valueOf(numbers[i]));
}
//开始冒牌排序似的比较,从后往前开始比较,小的往前冒泡
for(int i=0;i<arrayList.size();i++){
for(int j=arrayList.size()-1;j>i;j--){
//首先比较首字母,首字母小的往前
if(arrayList.get(j).charAt(0)<arrayList.get(j-1).charAt(0)){
String swap=arrayList.get(j);
Collections.swap(arrayList,j-1,j);
//如果首字母相同,再额外判断
}else if(arrayList.get(j).charAt(0)==arrayList.get(j-1).charAt(0)){
if(Compare(arrayList,arrayList.get(j),arrayList.get(j-1))){
Collections.swap(arrayList,j-1,j);
}
}
}
}
//字符串拼接
String result=arrayList.get(0);
for(int i=1;i<arrayList.size();i++){
result=result+arrayList.get(i);
}
return result;
}
//首字母相同时的判断函数
public boolean Compare(ArrayList arrayList,String a,String b) {
boolean bl = false;
if (a.length() == b.length()) {
if (Integer.valueOf(a) < Integer.valueOf(b)) bl = true;
} else {
int k=Math.abs(b.length() - a.length());
for (int i = 0; i <k ; i++) {
if (a.length() < b.length()) a = a + a.charAt(0);
else b = b + b.charAt(0);
}
if (Integer.valueOf(a) < Integer.valueOf(b)) bl = true;
}
return bl;
}
}