题目:
给定一个整数型数组,数组内所有数字都是非负的,让你求出由这个数组内所有数字组成的最小数。
例子:【10,2】 输出:102.
解释:最小数肯定不能是210,所以应该是102.
解析:这个题目在力扣上给定的标签是中等题,但是如果你发现不了问题的本质,该题并不好写出正确答案。需要考虑的点有:
1)最小数,那也就是说我们应该选择第一个字符是最小字符的数作为结果的第一个组成部分。比如说【10,2】,第一个数它的第一个字符为1,第二个数,第一个字符为2,所以我们选择第一个数作为结果的第一个组成部分。
2)然后再从剩下的数组内找第一个字符最小的数作为结果的第二个组成部分,以此类推。这道题就这样解决了???不是的,别忘了,还有3,30,31,32这种同时出现的情况呢。因此我们应该在每次比较获得第一个字符最小的数时,要记得比到最后一位,这也是个循环,如果本次字符相等,就往下比。
class Solution01 {
StringBuilder strBul = new StringBuilder();
List<String> listNum = new ArrayList<>();
public String minNumber(int[] nums) {
if(nums.length == 0) return "";
if(nums.length == 1) return String.valueOf(nums[0]);
for(int i = 0; i < nums.length; i++){
listNum.add(String.valueOf(nums[i]));
}
String result = recur(listNum);
return result;
}
public String recur(List<String> list){
if(list.size() == 1){
strBul.append(list.get(0));
return strBul.toString();
}
String strNum = list.get(0);
int flag = 0 ;
for(int i = 1; i < list.size(); i++){
int m = 0;
int n = 0;
while(true){
if(m < strNum.length() && n < list.get(i).length()){
if(strNum.charAt(m) < list.get(i).charAt(n)){
strNum = strNum;
flag = flag;
break;
}else if(list.get(i).charAt(n) < strNum.charAt(m)){
strNum = list.get(i);
flag = i;
break;
}else{
m++; n++;
}
}else{
if(strNum.length() < list.get(i).length()){
while(n < list.get(i).length()){
if(strNum.charAt(m-1) > list.get(i).charAt(n)){
strNum = list.get(i);
flag = i;
break;
}else if(strNum.charAt(m-1) < list.get(i).charAt(n)){
if(list.get(i).charAt(n) >= list.get(i).charAt(0)){
strNum = strNum;
flag = flag;
break;
}else{
strNum = list.get(i);
flag = i;
break;
}
}else{
n++;
if(n == list.get(i).length()){
strNum = list.get(i);
flag = i;
}
}
}
break;
}else if(strNum.length() > list.get(i).length()){
while(m < strNum.length()){
if(strNum.charAt(m) > list.get(i).charAt(n-1)){
if(strNum.charAt(m) >= strNum.charAt(0)){
strNum = list.get(i);
flag = i;
break;
}else{
strNum = strNum;
flag = flag;
break;
}
}else if(strNum.charAt(m) < list.get(i).charAt(n-1)){
strNum = strNum;
flag = flag;
break;
}else{
m++;
if(m == strNum.length()){
strNum = strNum;
flag = flag;
}
}
}
break;
}else{
strNum = strNum;
flag = flag;
break;
}
}
}
}
strBul.append(strNum);
list.remove(flag);
recur(list);
return strBul.toString();
}
}
这个代码大家可以了解看看,真到面试场上,顺利写完这种代码并且还能让面试官不对你有什么不满的情况肯定很少。所以重点在下面这种方法。
你细想,对于两个字符串来说,字符串的比较是如何进行的???是不是就和我们上面讲的思路一样啊,先从第一位字符开始比,如果相等就比较第二位,一直到比出大小。如果不相等直接得到大小。那我们上面说的不就是字符串的比较算法实现过程吗????
我们直接讲数组元素利用String.ValueOf()转化为字符串类型,放入列表中,讲列表进行正序排序。然后讲该正序排序结果字符累加不就得了嘛!
String Test(int[] nums){
List<String> list = new ArrayList<>();
for (int num : nums) {
list.add(String.valueOf(num)); // 或者nums[i]+""
}
list.sort((o1,o2) -> (o1+o2).compareTo(o2+o1));
StringBuilder s = new StringBuilder();
for (String value : list) {
/**
列表 add offer get poll remove
set add int a : set Iterator hasNext next()
map put get
*/
s.append(value);
}
return s.toString();
}