每天一道LeetCode-----将数值数组按一定顺序拼接,使得拼接的结果最大
2018-02-25 12:58
363 查看
Largest Number
原题链接Largest Number给定一个数值数组,将数组中的数值按照一定顺序拼接在一起,使得拼接的结果值最大
思路:
将原数值数组转为字符串数组,方便拼接和比较
将字符串数组排序
从头到尾拼接结果
难点在如何对字符串数组排序,为了使结果最大,可以得知需要将数字打的排到前面,以图片为例,
9的数字最大,所以排在第一位
随后是5,排在第二位
对于3,30,34而言,通过比较可以看到34330这样可以得到最大值
对于第三步,如何比较高位相等的一些数字呢(如3,30,34),如果以30和34为例,排序的结果无非是
30在34的前面
34在30的前面
这两种,所以就把这两种结果比较即可,即判断3034和3430的大小关系从而确定30和34的先后位置
代码如下
class Solution { public: string largestNumber(vector<int>& nums) { vector<string> strs(nums.size()); auto it = nums.begin(); /* 生成字符串数组 */ std::generate(strs.begin(), strs.end(), [&it]{ return std::to_string(*(it++)); }); /* 排序 */ std::sort(strs.begin(), strs.end(), [](auto& lhs, auto& rhs){ return lhs + rhs > rhs + lhs; }); /* 拼接 */ auto result = std::accumulate(strs.begin(), strs.end(), string(""), [](auto& res, auto& str) { return res + str; }); /* 去除前缀0 */ return (result.empty() || result.front() == '0') ? "0" : result; } };
相关文章推荐
- 每天一道LeetCode----从数组中选择若干不连续元素使得总和最大
- 每天一道LeetCode-----在给定数组中找到一个子数组,使得这个子数组的元素乘积最大
- 每天一道LeetCode-----将字符串切分成若干单词,使得每个单词都在给定的字典中,求出所有的切分结果
- 每天一道LeetCode-----将m × n矩阵按照顺时针螺旋顺序转化成一维数组
- 每天一道LeetCode-----给定字符串s和字符数组words,在s中找到words出现的位置,words内部字符串顺序无要求
- 每天一道LeetCode-----找到给定数组的连续子数组,使这个子数组的和最大,要求复杂度为O(n)
- 每天一道LeetCode-----计算给定范围内所有数的与运算结果
- 每天一道LeetCode-----摩尔投票法寻找给定数组中出现个数大于n/2或n/3的元素
- 用冒泡排序排列数组中的数字,并按一定顺序输出结果
- 每天一道LeetCode-----有序数组右移n位后查找某个元素
- 每天一道LeetCode-----有序数组循环右移n位后,寻找最小值,数组中可能包含重复元素
- 每天一道LeetCode-----在字符串s中找到最短的包含字符串t中所有字符的子串,子串中字符顺序无要求且可以有其他字符
- 每天一道算法题3 求子数组的最大和
- 每天一道算法题目,求数组中的最大值和最小值
- 每天一道LeetCode-----将用数组表示的整数加一,两个用字符串表示的(二进制)数相加
- 每天一道LeetCode-----将字符串切分,使每个子串都是回文串,计算所有可能结果和最小切分次数
- 每天一道LeetCode-----给定大小为n+1的数组,元素大小在[1 : n]之间,只有一个元素会重复出现多次,找到重复的那个
- 每天一道算法题(14)——N个降序数组,找到最大的K个数
- 每天一道LeetCode-----买卖商品问题,计算最大利润,分别有一次交易,两次交易,多次交易的情况
- 用冒泡排序排列数组中的数字,并按一定顺序输出结果