19 把数组排成最小的数

0 引言

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

1 抽象问题具体化

举例1:输入数组{3,32,321},打印出这三个数字能排成的最小数字.

  1. 3与32相比,332 > 323,故32排在3的前边,得到序列32,3;

  2. 321与3相比,3321 > 3213,故321排在3的前边;321与32相比,32321 > 32132,321排在32的前边,得到序列321,32,3;

  3. 打印序列321323.

2 具体问题抽象分析

  1. 定义排序规则:将两个数用字符串的形式拼接起来,比较大小之后,返回结果.

  2. 将所有数拼接起来,输出即可.

  3. 为了便于对数中的每个数字单独处理,将数转成字符串.

3 demo

    // 排序规则,默认str1在str2的后面;返回true时,交换二者顺序;
    bool compareNums(string str1, string str2){        
        long num1 = stol(str1 + str2);
        long num2 = stol(str2 + str1);
        if( num1 > num2)
            return false;
        else
            return true;
    }
    string PrintMinNumber(vector<int> numbers) {
        for(int i=1;i < numbers.size();i++){
            for(int j=i;j>0;j--){
                if(compareNums(to_string(numbers[j]),to_string(numbers[j-1]))){
                    int temp = numbers[j];
                    numbers[j] = numbers[j-1];
                    numbers[j-1] = temp;
                }
            }
        }
        string myString = "";
        for(int i=0;i<numbers.size();i++)
            myString += to_string(numbers[i]);
        return myString;
    }

4 代码优化

原文地址:https://www.cnblogs.com/ghjnwk/p/10111393.html