剑指offer java版 test32—把数组排成最小的数

前言:想了半天,想了种思路,觉得完美,代码写出来后,一测试,通过,自信满满的去评论区,发现。。原来还有更好的办法,这就是满罐子不荡半罐子荡吗 哈~ 学无止境,但还是可开心 又凭自己的能力写出了个代码

  1. 题目:

输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。

  1. 思路: 我的vs大佬们的
    我的:数首字母越小的 越要放前面,所以我用冒泡排序的流程,比较各数字首字母的大小,再比较途中,如果发现首字母相同的,比如3,32,321,那么这里我突然想到了,把3扩充为333,32扩充为323,然后大家都是3位数了,比较大小,小的再前面(源于我不停的拼接这3个字符时,产生的灵感,实际上就是这样,有点无法言述)。然后排好序后,字符串一拼接就好了。
    大佬们的:将数组转换为字符串,字符串拼接后比较大小,若字符串a+b小于字符串b+a,则a在前面。。。。。。然后逐一比较。。。怎么说呢,看完了后,觉得我在编程的路上走的尽是弯路。

  2. 待码:贴上我的弯路代码

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;
  }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值