算法题解:把数组排成最小的数

本文介绍了一种算法,该算法接收一个正整数数组,通过特定规则将这些数字拼接成一个整体数字,并找出所有可能组合中的最小值。例如对于数组{3,32,321}

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

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

代码实现

import java.util.ArrayList;

public class Solution {
    public String PrintMinNumber(int [] numbers) {
        //0不能作为首位,当然,题目中已经确定是正整数数组,在本题中可以不用考虑0
        //尽可能小的数字放高位
        //所有数字先比首位,首位最小的先放高位;若首位相同,则首位相同的比较次位
        //取出第一个数字作为高位后,再次循环处理其它数字
        //
        StringBuffer res = new StringBuffer("");
      //  int index = 0;
        for(int i=0;i<numbers.length-1;i++){
            int min =  numbers[i];
            for(int j=i+1;j<numbers.length;j++){
                String t = compareTwoNum(String.valueOf(numbers[i]),String.valueOf(numbers[j]));
               
                    if(Integer.parseInt(t) == numbers[j]){
                        int tmp = numbers[i];
                        numbers[i] = numbers[j];
                        numbers[j] = tmp;
                    }
                
            }
        }
        
        for(int i=0;i<numbers.length;i++){
            
            res.append(String.valueOf(numbers[i]));
        }
        return res.toString();
       
    }
    
     //比较两个数中哪个数更小
        //比较规则:先比首位,首位最小的直接返回;
        //若首位相同,若后续都还有位,则比较后续位
        //          若后续一个有位一个没有位,则将后续有位的与前一个位比较,比较次位数位更小的
        public String compareTwoNum(String x,String y){
           int a = Integer.parseInt(x.substring(0,1));
           int b = Integer.parseInt(y.substring(0,1));
           if(a<b){
               return x;
           }else if( a==b){
               if(x.length() - 1>0 && y.length() -1 >0){
                   String res = compareTwoNum(String.valueOf(x).substring(1),
                            String.valueOf(y).substring(1));
                   return a+res;
               }else if(x.length() - 1>0 && y.length() -1 ==0){
                   String tt = compareTwoNum(x.substring(1),y);   //每一位都去比较,如果y小于x的每一位,则返回y,否否则返回x;
                   if(tt.equals(y)){       
                       return y;
                   }else{
                       return x;
                   }
//                    int c  = Integer.parseInt(x.substring(1).substring(0,1));
//                    if(c<a){
//                        return x;
//                    }else if(c==a){
                       
//             	   String tt = compareTwoNum(x.substring(2).substring(0,1),String.valueOf(a)); 
//             	   if(Integer.parseInt(tt) == a){
//             		  return y; 
//             	   }else{
//             		   return String.valueOf(a)+String.valueOf(c)+tt;
//             	   }
               
//                    }else{
//                        return y;
//                    }
               }else if(x.length() - 1==0 && y.length() -1 >0){
                   String tt = compareTwoNum(y.substring(1),x);
                   if(tt.equals(x)){
                       return x;
                   }else{
                       return y;
                   }
//                    int c  = Integer.parseInt(y.substring(1).substring(0,1));
//                    if(c<a){
//                        return y;
//                    }else if(c==a){
                       
//             	   String tt = compareTwoNum(y.substring(2).substring(0,1),String.valueOf(a)); 
//             	   if(Integer.parseInt(tt) == a){
//             		  return x; 
//             	   }else{
//             		   return String.valueOf(a)+String.valueOf(c)+tt;
//             	   }
               
//                    }else{
//                        return x;
//                    }
               }
               
           }else{
               return y;
           }
            return x;
        }
    
    
}

解题思路

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值