• Lc第307场周赛 6166. 最大回文数字(贪心/分类讨论)


    题目链接:https://leetcode.cn/problems/largest-palindromic-number/

    题目描述

    给你一个仅由数字(0 - 9)组成的字符串 num 。

    请你找出能够使用 num 中数字形成的 最大回文 整数,并以字符串形式返回。该整数不含 前导零 。

    注意:

    你 无需 使用 num 中的所有数字,但你必须使用 至少 一个数字。
    数字可以重新排序。

     

    示例 1:

    输入:num = "444947137"
    输出:"7449447"
    解释:
    从 "444947137" 中选用数字 "4449477",可以形成回文整数 "7449447" 。
    可以证明 "7449447" 是能够形成的最大回文整数。
    示例 2:

    输入:num = "00009"
    输出:"9"
    解释:
    可以证明 "9" 能够形成的最大回文整数。
    注意返回的整数不应含前导零。

     

    提示:

    1 <= num.length <= 105
    num 由数字(0 - 9)组成

     

    思路 

            先讨论回文串的前一半,用从首位开始枚举最大的数字,然后再往后一个个贪心枚举最大数字。枚举完前一半字符串后,反转该字符串并与原来的字符串拼接。由于答案要尽可能大,所以位数要尽可能多,因此在回文串正中间也要再拼上一位数字。

    C++代码

    1. class Solution {
    2. public:
    3. string largestPalindromic(string num) {
    4. int cnt[11] = {};
    5. string res = "";
    6. for(char i : num) ++cnt[i - '0'];
    7. //先讨论前一半字符串的首位,注意不含0
    8. for(int i = 9; i > 0; i--){
    9. if(cnt[i] >= 2){
    10. res += to_string(i);
    11. cnt[i] -= 2; //要构成回文,肯定有大于等于2个该数字
    12. break; //注意别忘了及时break掉,不然答案会错
    13. }
    14. }
    15. //字符串为空,说明整个字符串只有0或者单个其它数字
    16. if(res == "")
    17. for(int i = 9; i >= 0; i--)
    18. if(cnt[i]) return to_string(i);
    19. //讨论完首位,把余下来的位置(该回文串的前一半)讨论完
    20. for(int i = 9; i >= 0; i--){
    21. while(cnt[i] >= 2){
    22. res += to_string(i);
    23. cnt[i] -= 2;
    24. }
    25. }
    26. //反转前一半字符串,拼接在一起作为结果输出
    27. string ans = string(res.rbegin(), res.rend());
    28. //因为回文串位数越多越好,所以还有没用掉的数字的话,可以加一位在回文串的正中间
    29. for(int i = 9; i >= 0; i--)
    30. if(cnt[i]){
    31. res += to_string(i);
    32. break;
    33. }
    34. return res + ans;
    35. }
    36. };

  • 相关阅读:
    ArcGIS 底图服务前端加载某些级别不显示问题
    NPOI组件下载、引用、基本使用
    springboot简述
    MySQL之优化SELECT语句
    Hash 表
    记事小本本
    软件‘小程序‘前台开发软件定制的知识|app网站搭建
    java面试——集合(ArrayList、lterator、LinkedList)源码理解
    docker - 分享
    怎么语音转文字?快来看看这些方法
  • 原文地址:https://blog.csdn.net/m0_56494923/article/details/126460961