You need to enable JavaScript to run this app. 给定回文字符串求严格小于它的最大回文数的代码修复
优惠活动
大模型
产品
解决方案
定价
更多

给定回文字符串求严格小于它的最大回文数的代码修复

问题说明

给定表示回文数字N的字符串S,需要找出严格小于N的最大回文数字。现有求解代码在部分测试用例下返回错误结果,需要修正代码问题。
现有代码如下:

string nextSmallerPalindrome(string &s)
{
    int n = s.length();
    string ans = "";
    
    if(n == 1)
    {
        s[0]--;
        return s;
    }
    
    if(s == "11")
    {
        return "9";
    }
    
   // 处理奇数长度场景
    if(n % 2 != 0)
    {
        int idx = n / 2;
        int diff = 0;
        
        if(s[idx] == '0')
        {
            s[idx] = '9';
            diff = 1;
        }
        else
        {
            s[idx]--;
        }
        
        idx--;
        
        while(idx >= 0 && diff == 1)
        {
            if(s[idx] == '0')
            {
                s[idx] = '9';
                idx--;
            }
            else
            {
                s[idx]--;
                diff = 0;
                break;
            }
        }
        
        int i = 0;
        while(i < n && s[i] == '0')
        {
            i++;
        }
        
        for(; i < n; i++)
        {
            ans = ans + s[i];
        }
        
        int new_n = ans.length();
        
        int j = 0;
        int k = new_n - 1;
        
        while(j < k)
        {
            if(ans[j] == ans[k])
            {
                j++;
                k--;
            }
            else
            {
                ans[k] = ans[j];
                j++;
                k--;
            }
        }
        
        return ans;
    }
    else                             // 处理偶数长度场景
    {
        int idx = n / 2 - 1;
        int diff = 0;
        
        if(s[idx] == '0')
        {
            s[idx] = '9';
            diff = 1;
        }
        else
        {
            s[idx]--;
        }
        
        idx--;
        
        while(idx >= 0 && diff == 1)
        {
            if(s[idx] == '0')
            {
                s[idx] = '9';
                idx--;
            }
            else
            {
                s[idx]--;
                diff = 0;
                break;
            }
        }
        
        int i = 0;
        while(i < n && s[i] == '0')   // 忽略字符串前导零
        {
            i++;
        }
        
        for(; i < n; i++)     // 忽略前导零后将字符串内容存入新字符串ans
        {
            ans = ans + s[i];
        }
        
        int new_n = ans.length();
        
        int j = 0;
        int k = new_n - 1;
        
        while(j < k)                // 校验并将后半段替换为前半段的镜像
        {
            if(ans[j] == ans[k])
            {
                j++;
                k--;
            }
            else
            {
                ans[k] = ans[j];
                j++;
                k--;
            }
        }
        
        return ans;
    }
}
输入格式
  • 输入第一行包含整数T,表示测试用例数量
  • 每个测试用例仅一行,为待求更小回文数的字符串S
测试用例
19
7
77
101
1001
1221
144441
3444444443
57855875
10000001
11
1
111
101
1001
11011
1110111
1190911
20002
10011001

内容的提问来源于stack exchange,提问作者Vishal Kumar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.16 12:54:04