数组-将数组重新排序以构造最小值-中等

描述
给定一个整数数组,请将其重新排序,以构造最小值。
The result may be very large, so you need to return a string instead of an integer.

样例
给定 [3, 32, 321],通过将数组重新排序,可构造 6 个可能性数字:
3+32+321=332321
3+321+32=332132
32+3+321=323321
32+321+3=323213
321+3+32=321332
321+32+3=321323
其中,最小值为 321323,所以,将数组重新排序后,该数组变为 [321, 32, 3]。
挑战

在原数组上完成,不使用额外空间。

题目链接

分析

这里我们使用了stringstream类型的变量,将int先存入其中,再保存到string的数组中。然后使用sort函数进行排序,这里的排序比较是进行字符串的大小比较。现在字符串的数字是从小到大去排列的,然后再进行各个字符串的拼接。

这里需要处理特殊情况,比如以0开头的;全部是0的情况。

程序

class Solution {
public:
    /**
     * @param nums: n non-negative integer array
     * @return: A string
     */
    static bool cmp(const string s1, const string s2) {
        return (s1 + s2) < (s2 + s1);
    }
    string minNumber(vector<int> &nums) {
        // write your code here
        vector<string> s_nums(nums.size());
        stringstream stream;
        for (int i = 0; i < nums.size(); ++i) {
            stream << nums[i];
            stream >> s_nums[i];
            stream.clear();
        }
        sort(s_nums.begin(), s_nums.end(), cmp);
        string result;
        for (int i = 0; i < s_nums.size(); ++i) {
            result += s_nums[i];
        }
        //首字母为0
        string res;//[0,1]
        bool flag = false;
        for (int i = 0; i < result.size(); ++i) {
            if (result[i] != '0') {
                res.push_back(result[i]);
                flag = true;
            } else if (flag) {
                res.push_back(result[i]);
            }
        }
        if (!flag) res.push_back('0');//[0]
        return res;
    }
};


猜你喜欢

转载自blog.csdn.net/qq_18124075/article/details/80683632
今日推荐