Skip to content
本页目录

45-把数组排成最小的数

题目描述

https://leetcode.cn/problems/ba-shu-zu-pai-cheng-zui-xiao-de-shu-lcof

输入一个非负整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。

示例 1:

输入: [10,2]
输出: "102"

示例 2:

输入: [3,30,34,5,9]
输出: "3033459"

提示:

0 < nums.length <= 100

说明:

  • 输出结果可能非常大,所以你需要返回一个字符串而不是整数
  • 拼接起来的数字可能会有前导 0,最后结果不需要去掉前导 0

思路分析

基本思路,按照前置位排序

排序完成后,按次序输出

这道题的难点在与找到一个自定义的 比较大小的方式

如果 直接比较两个数字,从首位开始比较,则较难处理字符串,这一步考虑太复杂了

其实 题目要求两个数字拼接后的最小值,那么直接 拼接 [num1][num2] 和 [num2][num1] 比较字符串大小即可

实现代码

csharp
public class Solution {
    private bool LargeThan(int num1, int num2){
        string str1 = num1.ToString();
        string str2 = num2.ToString();
        string s1 = str1+str2;
        string s2 = str2+str1; 
        for(int i = 0; i < s1.Length; i++){
            if(s1[i] != s2[i]){
                return s1[i] > s2[i];
            }
        }
        return false;
    }
    public string MinNumber(int[] nums) {
        for(int i=0; i<nums.Length-1; i++){
            for(int j=i+1; j<nums.Length; j++){
                if(LargeThan(nums[i],nums[j])){
                    //swap
                    int tmp = nums[i];
                    nums[i] = nums[j];
                    nums[j] = tmp;
                }
            }
        }
        //输出
        string result = "";
        for(int i=0;i < nums.Length; i++){
            result += nums[i].ToString();
        }
        return result;
    }
}

思路2:SortedSet错误

使用 SortedSet 按照字母序列将数组加入,然后按照顺序输出结果 测试用例 [3,30] 不通过,会返回 330 而不是 303,数字 3 排在了 30 前面 错误原因:SortedSet按照字符串排序,3 排在了30之前,不符合题意

csharp
public class Solution {
    public string MinNumber(int[] nums){
        SortedSet<string> s = new SortedSet<string>();
        for(int i=0; i<nums.Length; i++){
            s.Add(nums[i].ToString());
        }
        StringBuilder sb = new StringBuilder();
        foreach(var num in s){
            sb.Append(s);
        }
        return sb.ToString();
    }
}

思路3

定义

csharp
public class Solution {
    public string MinNumber(int[] nums) {
        //自定义按照字符顺序排序
        Array.Sort(nums, (a,b)=>{
            return (a+""+b+"").CompareTo(b+""+a+"");
        });
        StringBuilder sb = new StringBuilder();
        for(int i=0; i<nums.Length; i++){
            sb.Append(nums[i].ToString());
        }
        return sb.ToString();
    }
}

Released under the MIT License.