ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

leetcode 564. 寻找最近的回文数(贪心+模拟)

2022-03-02 13:00:47  阅读:152  来源: 互联网

标签:string candidate 564 len 替换 candidates 贪心 leetcode 回文


题目描述:

给定一个表示整数的字符串 n ,返回与它最近的回文整数(不包括自身)。如果不止一个,返回较小的那个。

“最近的”定义为两个整数差的绝对值最小。

示例 1:

输入: n = "123"
输出: "121"

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/find-the-closest-palindrome
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路:

最简单的一种构造方法,是用前面元素将后面回文对应的元素进行替换,比如 12345,可以用1替换5,2替换4,得到12321,但是还有一种情况,比如12399,我们采用上述方法替换为12321,但是实际上,12421更接近12399。因此,问题就可以确定在中间元素上

  • 中间元素保持不变;
  • 中间元素+1;
  • 中间元素-1;

因此,我们可以总结出以下的方案:

  • 用原数的前半部分替换后半部分得到的回文整数
  • 用原数的前半部分加一后的结果替换后半部分得到的回文整数
  • 用原数的前半部分减一后的结果替换后半部分得到的回文整数。
  • 还要特别注意两种特殊情况,假如 999的时候,增大中间部分会导致位数增加,得到1001,同样还有101的情况,减小中间部分会导致位数减少,得到99,因此为了防止位数变化导致构造的回文整数错误,因此我们直接构造999..999和100..001这两个备选的答案。

代码:

class Solution {
public:
    vector<long> getCandidates(string n){    //构造备选答案
        int len = n.size();
        vector<long> candidates = {  //避免漏掉两个极端情况
            (long) pow(10,len-1)-1,
            (long) pow(10,len)+1,
        };
        int half = (len+1)/2;
        long pre = stol(n.substr(0,half)); //中间的也取到
        vector<long> preSet={pre-1,pre,pre+1};
        for(auto&num:preSet){
            string p = to_string(num);
            string candidate = p + string(p.rbegin()+(len&1),p.rend()); //注意,这里学到新的一招,string(rbegin(),rend())即可获得逆序
            candidates.emplace_back(stol(candidate));
        }
        return candidates;
    }
    string nearestPalindromic(string n) {
        long cur = stol(n),ans = -1;
        vector<long> candidates = getCandidates(n);
        for(auto&candidate:candidates){  //遍历备选答案
            if(candidate!=cur){
                if(ans==-1||abs(candidate - cur)<abs(ans - cur)|| abs(candidate-cur) == abs(ans - cur)&&candidate<ans){
                    ans = candidate;
                }
            }
        }
        return to_string(ans);
    }
};

标签:string,candidate,564,len,替换,candidates,贪心,leetcode,回文
来源: https://blog.csdn.net/sinat_37668729/article/details/123226855

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有