描述
给定一个整数数组,请将其重新排序,以构造最小值。
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]。
挑战
给定一个整数数组,请将其重新排序,以构造最小值。
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; } };