把数组排成最小的数

// 面试题45:把数组排成最小的数
    // 题目:输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼
    // 接出的所有数字中最小的一个。例如输入数组{3, 32, 321},则打印出这3个数
    // 字能排成的最小数字321323。
    static void print_min_num(const std::vector<uint32_t>& arr)
    {
        if(arr.empty())
        {
            return;
        }

        std::vector<std::string> strs(arr.size());
        for(size_t i = 0; i < arr.size(); ++i)
        {
            strs[i] = std::to_string(arr[i]);
        }

        std::array<char, 21> tmp1; // int型整数用十进制表示最多只有10位
        std::array<char, 21> tmp2;

        auto fun = std::bind(_compare, std::placeholders::_1, std::placeholders::_2,
                             std::ref(tmp1), std::ref(tmp2));

        sort(strs.begin(), strs.end(), fun);

        for(auto i:strs)
        {
            printf("%s", i.c_str());
        }
        printf("\n");
    }

    static int _compare(const std::string& str1, const std::string& str2,
                        std::array<char, 21>& tmp1, std::array<char, 21>& tmp2)
    {
        strcpy(static_cast<char*>(tmp1.begin()), str1.c_str());
        strcat(static_cast<char*>(tmp1.begin()), str2.c_str());

        strcpy(static_cast<char*>(tmp2.begin()), str2.c_str());
        strcat(static_cast<char*>(tmp2.begin()), str1.c_str());

        auto ret = strcmp(static_cast<char*>(tmp1.begin()), static_cast<char*>(tmp2.begin()));
        return ret < 0;
    }

 

点赞