leetcode 564. Find the Closest Palindrome

Given an integer n, find the closest integer (not including itself), which is a palindrome.

The 'closest' is defined as absolute difference minimized between two integers.

Example 1:

Input: "123"
Output: "121"

 

Note:

  1. The input n is a positive integer represented by string, whose length will not exceed 18.
  2. If there is a tie, return the smaller one as answer.

给定一个整数 n ,你需要找到与它最近的回文数(不包括自身)。

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

示例 1:

输入: "123"
输出: "121"
注意:

n 是由字符串表示的正整数,其长度不超过18。
如果有多个结果,返回最小的那个。

解题思路:

  • 因为是最近的回文数,也就是两个整数差的绝对值最小,所以排除在字符串加前缀或后缀使之变成回文串的情况。所以考虑将原有字符串改成回文串。因为要差的绝对值最小,所以要改低位。
  • n本身不是回文串且是奇数。
    "123" -> "121"
    将1翻转后连接在"12"后。
    n本身不是回文串且长度为偶数
    "1234" -> "1221"
    将"12"翻转后连接在"12"后面
    n是回文串且长度为奇数,因为最近的回文串不能是自身,所以要改最中间的位。
    要么加1 , 要么减1 ;
    比如"121" -> "111"  或者  "131"
    但是如果减1,存在中间位为0的情况
    如果-1位数不变,比如"11011" 中的 "110" - 1 变为 "109", 然后将"10"翻转后连接在"109"后是"10901",但是+1变为"11111","11111"与"11011"的绝对值的差最小,所以不能判断+1,-1哪个是最近回文数。
    
    如果-1位数变了,比如"10001"中的"100"-1变为"99",将9翻转后连接在"99"的后是"999",+1后是"10101",两个都不是最近回文数,"9999"才是。
    
    所以为了将+1,-1后位数改变的情况考虑进去,将pow(10 , len - 1) - 1 和 pow(10 , len) + 1 加入到set中。
    
    

     

    n是回文串且长度为偶数,因为最近的回文串不能是自身,所以要改最中间的两位。
    情况与奇数类似。
    

     

  • 为了统一处理奇偶的情况,一律将前缀定为 pre = n.substr(0 , (len + 1) / 2) ;
    将前缀-1 , +0 , +1 ;
    若是奇数,则将 (pre.rbegin() + (len & 1) , pre.rend()) ;
    
    通过len&1来判断长度是奇数还是偶数 。

     

  •  

    class Solution {
    public:
        string nearestPalindromic(string n) 
        {
            int len = n.size() ;
            if(len == 0) return "-1" ;
            
            long nl= stol(n) ;
            unordered_set<long> s ;
            long mindiff = LONG_MAX ;
            string ans ;
            s.insert(pow(10 , len) + 1) ;
            s.insert(pow(10 , len - 1) - 1) ;
            
            
            long pre = stol(n.substr(0 , (len + 1) / 2)) ;
            
            for(int i = -1 ; i <= 1 ; ++i)
            {
                long p = pre + i ;
                string prefix = to_string(p) ;
                string suffix(prefix.rbegin() + (len & 1) , prefix.rend()) ;
                s.insert(stol(prefix + suffix)) ;    
            }
            
            s.erase(nl) ;
            
            for(auto ele : s)
            {
                if(abs(ele - nl) < mindiff)
                {
                    mindiff = abs(ele - nl) ;
                    ans = to_string(ele) ;
                }
                else if(abs(ele - nl) == mindiff)
                {
                    long m = min(ele , stol(ans)) ;
                    ans = to_string(m) ;
                }
            }
            
            return ans ;
        }
    };

     

     

     

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
智慧校园整体解决方案是响应国家教育信息化政策,结合教育改革和技术创新的产物。该方案以物联网、大数据、人工智能和移动互联技术为基础,旨在打造一个安全、高效、互动且环保的教育环境。方案强调从数字化校园向智慧校园的转变,通过自动数据采集、智能分析和按需服务,实现校园业务的智能化管理。 方案的总体设计原则包括应用至上、分层设计和互联互通,确保系统能够满足不同用户角色的需求,并实现数据和资源的整合与共享。框架设计涵盖了校园安全、管理、教学、环境等多个方面,构建了一个全面的校园应用生态系统。这包括智慧安全系统、校园身份识别、智能排课及选课系统、智慧学习系统、精品录播教室方案等,以支持个性化学习和教学评估。 建设内容突出了智慧安全和智慧管理的重要性。智慧安全管理通过分布式录播系统和紧急预案一键启动功能,增强校园安全预警和事件响应能力。智慧管理系统则利用物联网技术,实现人员和设备的智能管理,提高校园运营效率。 智慧教学部分,方案提供了智慧学习系统和精品录播教室方案,支持专业级学习硬件和智能化网络管理,促进个性化学习和教学资源的高效利用。同时,教学质量评估中心和资源应用平台的建设,旨在提升教学评估的科学性和教育资源的共享性。 智慧环境建设则侧重于基于物联网的设备管理,通过智慧教室管理系统实现教室环境的智能控制和能效管理,打造绿色、节能的校园环境。电子班牌和校园信息发布系统的建设,将作为智慧校园的核心和入口,提供教务、一卡通、图书馆等系统的集成信息。 总体而言,智慧校园整体解决方案通过集成先进技术,不仅提升了校园的信息化水平,而且优化了教学和管理流程,为学生、教师和家长提供了更加便捷、个性化的教育体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值