zoukankan      html  css  js  c++  java
  • 把数组排成最小的数

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

    例如输入数组{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;
    }
  • 相关阅读:
    多线程
    带缓存的输入输出流
    输入输出流I/O2
    输入输出流I/O
    课堂所讲整理:包装&工具类
    课堂所讲整理:Set和Map
    Java泛型和链表
    Java继承_接口练习题
    P235 实战练习(集合类)
    P188 实战练习(父类和子类)
  • 原文地址:https://www.cnblogs.com/xiaokang01/p/12445776.html
Copyright © 2011-2022 走看看