leetcode.179.最大数(largest-number)

我就是我 2022-11-18 05:52 248阅读 0赞

179.最大数

给定一组非负整数 nums,重新排列每个数的顺序(每个数不可拆分)使之组成一个最大的整数。

**注意:**输出结果可能非常大,所以你需要返回一个字符串而不是整数。

示例 1:

  1. 输入:nums = [10,2]
  2. 输出:"210"

示例 2:

  1. 输入:nums = [3,30,34,5,9]
  2. 输出:"9534330"

示例 3:

  1. 输入:nums = [1]
  2. 输出:"1"

示例 4:

  1. 输入:nums = [10]
  2. 输出:"10"

提示:

  • 1 <= nums.length <= 100 100 100
  • 0 <= nums[i] <= 1 0 9 10^{9} 109

代码与思路

大概思路就是比较两个数,依次比较他们的最高位,如果最高位相同,比较次高位。(两个数位数不一样可以比较吗,也是可以的,比如[45,123],4大于1,所以45放前面),这种排序对于输入数组没有相同数字开头的时候是有效的,比如{ 45,56,81,76,123 };81765645123
输入数组有相同数字开头的情况:
[4,42]比较,442>424,所以要把4放在前面;
[4,45]比较,454>445,所以要把45放在前面。
两个数字比较后,相对位置的关系就知道了,没有必要进行全排列比较。

  1. #include <vector>
  2. #include <iostream>
  3. #include <algorithm>
  4. #include <string>
  5. #include <numeric>
  6. using namespace std;
  7. class Solution {
  8. public:
  9. string largestNumber(vector<int>& nums) {
  10. vector<string> vs;
  11. transform(nums.begin(), nums.end(), back_inserter(vs), [](int x) { return to_string(x); });// algorithm---transform
  12. sort(vs.begin(), vs.end(), [](const string& a, const string& b) {
  13. return a + b > b + a;
  14. });
  15. string res = accumulate(vs.begin(), vs.end(), string());// numeric---accumulate
  16. return res[0] == '0' ? "0" : res;
  17. }
  18. string largestNumber2(vector<int>& nums) {
  19. // 将 nums 中的元素按照如下示例规则排序:
  20. // 因 "2" + "10" > "10" + "2" , 故 2 排在 10 的前面
  21. sort(nums.begin(), nums.end(), [](int x, int y) {
  22. string a = to_string(x), b = to_string(y);
  23. return a + b > b + a;
  24. });
  25. // 将排序后的数组转为字符串
  26. string ans = "";
  27. for (int n : nums) ans += to_string(n);
  28. // 输入为 [0,0] 时,输出应该为 "0"
  29. return ans[0] == '0' ? "0" : ans;
  30. }
  31. };
  32. int main()
  33. {
  34. int nums[] = { 3,30,34,5,9 };
  35. vector<int> v(nums, nums + 5);
  36. for (auto it : v)
  37. {
  38. cout << it << endl;
  39. }
  40. Solution s;
  41. cout << s.largestNumber(v) << endl;
  42. }

参考

发表评论

表情:
评论列表 (有 0 条评论,248人围观)

还没有评论,来说两句吧...

相关阅读

    相关 179.

    给定一组非负整数 `nums`,重新排列它们每个数字的顺序(每个数字不可拆分)使之组成一个最大的整数。 注意:输出结果可能非常大,所以你需要返回一个字符串而不是整数。 示例

    相关 LeetCode179.

    难度:`中等` 题目描述: > 给定一组非负整数 nums,重新排列每个数的顺序(每个数不可拆分)使之组成一个最大的整数。 > 注意:输出结果可能非常大,所以你需要返

    相关 179.

    > 给定一组非负整数 nums,重新排列每个数的顺序(每个数不可拆分)使之组成一个最大的整数。 > > 注意:输出结果可能非常大,所以你需要返回一个字符串而不是整数。 >

    相关 Leetcode 179.

    题目重述 给定一组非负整数 nums,重新排列每个数的顺序(每个数不可拆分)使之组成一个最大的整数。 注意:输出结果可能非常大,所以你需要返回一个字符串而不是整数。