把数组排成最小的数

Posted xiaokang01

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了把数组排成最小的数相关的知识,希望对你有一定的参考价值。

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

例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。

题解:

这里涉及到了整数转换字符串问题

我们可以先将数组转换成字符串,存放在一个字符串容器中vector<string>

然后对这个容器进行自定义规则排序

a+b < b+a  就把a放在b前面

就是说: 2  21  因为 212 < 221 所以a要放在b前面

然后进行字符串拼接

 1 #include <iostream>
 2 #include <vector>
 3 #include <string>
 4 #include <algorithm>
 5 
 6 using namespace std;
 7 
 8 class Solution {
 9 public:
10     
11     static bool cmmp(string a, string b)
12     {
13         return (a+b) < (b+a);  // 按照从小到大排序
14     }
15     string PrintMinNumber(vector<int> numbers)
16     {
17         int len = numbers.size();
18         if (len <= 0)
19             return "";
20         vector<string> str;
21         for(int i = 0; i< len; i++)
22         {
23             // 将数组中的数转换成字符串,保存到字符串数组中
24             str.push_back(to_string(numbers[i]));
25         }
26         //排序
27         sort(str.begin(), str.end(), cmmp);
28         string res;
29         for(int i = 0; i< len; i++)
30         {
31             res += str[i];
32         }
33         cout << res;
34         return res;
35     }
36 };
37 int main()
38 {
39     Solution s;
40 
41     vector <int> vec = {3,32,321};
42    string res =  s.PrintMinNumber(vec);
43    cout << res << endl;
44     return 0;
45 }

 

也可以不用辅助数组,直接按照上面的规则进行排序,思路一样

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>

using namespace std;
/*
 * 对vector内的数据进行排序,按照 这种规则:
 * 将a和b准换成字符串之后to_string
 * 如果 a+b < b+a  就把a放在b前面
 * 如 2 21 因为212 < 221 所以排序后是 21 2
 * to_string 可以将int转换成string类型
 */
class Solution {
public:
    static bool cmp(int a, int b)
    {
        string s1 = to_string(a) + to_string(b);
        string s2 = to_string(b) + to_string(a);
        return  s1 < s2;   // s1<s2 就把s1放在前面
    }
    string PrintMinNumber(vector<int> numbers) {

        int len = numbers.size();
        if(len <= 0)
            return "";
        sort(numbers.begin(), numbers.end(), cmp);
        string res;
        for(int i = 0; i < len; i++)
        {
            res += to_string(numbers[i]);
        }
        return res;
    }
};
int main()
{
    Solution s;
    vector <int> vec = {3,32,321};
   string res =  s.PrintMinNumber(vec);
   cout << res << endl;
    return 0;
}

 

以上是关于把数组排成最小的数的主要内容,如果未能解决你的问题,请参考以下文章

面试题:把数组排成最小的数

剑指offer三十二之把数组排成最小的数

Java 剑指offer(45) 把数组排成最小的数

剑指 Offer 45. 把数组排成最小的数 剑指 Offer 61. 扑克牌中的顺子 剑指 Offer 40. 最小的k个数

剑指offer 面试题33 把数组排成最小的数

把数组排成最小的数