【剑指offer较难部分14】把数组排成最小的数(java)

题目描述

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

分析

该题要求我们求出数组排列组合后的最小数字,那么该题就是排列组合问题,可以用之前写过的题的模板套一下,步骤基本相同,小改即可。没接触过全排列的可以先看下面的题。

字符串的排列

步骤:
第一步:求出所有的组合方式,将其放在一个list中
第二步:排序,第一个即为最小,返回它即可

实现代码:

import java.util.ArrayList;
import java.util.Collections;
public class Solution {
    
    
    public String PrintMinNumber(int [] numbers) {
    
    
        if(numbers == null || numbers.length == 0){
    
    
            return "";
        }
        //第一步,可以求出所有的组合方式,将其放在一个list中---全排列问题
        ArrayList<String> list = new ArrayList<>();
        //全部排列组合
        AllPermutation(numbers, list, 0);
        //第二步,排序,第一个即为最小值,返回即可
        Collections.sort(list);
        return list.get(0);
        
    }
    
    public void AllPermutation(int[] numbers, ArrayList<String> list, int pos){
    
    
        //若走到最后,则表示当前执行完毕,添加进list
        if(pos == numbers.length - 1){
    
    
            StringBuilder sb = new StringBuilder();
            for(int num : numbers){
    
    
                sb.append(num);
            }
            if(!list.contains(sb.toString())){
    
    
                list.add(sb.toString());
            }
            return;
        }
        for(int i = pos ; i < numbers.length ; i++){
    
    
            swap(numbers, i, pos);
            AllPermutation(numbers, list, pos+1);
            swap(numbers, i, pos);
        }
    }
    
    public void swap(int[] numbers, int i, int j) {
    
    
        int temp = numbers[i];
        numbers[i] = numbers[j];
        numbers[j] = temp;
    }
}

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_39615182/article/details/112493704