寻找下一个回文

Posted

技术标签:

【中文标题】寻找下一个回文【英文标题】:Find the next palindrome 【发布时间】:2016-01-31 19:54:18 【问题描述】:

给定一个数字,我试图找到大于给定数字的最小回文数。这是我的代码:

#include<bits/stdc++.h>
using namespace std;
char a[1000005];
int main()
    int t,len,ni,nj,nk,i,j,k;
    cin>>t;
    while(t--)
        cin>>a;
        char ch=getchar();
        len=strlen(a);
        k=len-1;
        for(i=0;i<len;i++)
            if(a[i]!='9')
                break;
            
        
        if(i==len)                         //if all digits are 9
            for(i=len-1;i>0;i--)
                a[i]='0';
            
            a[0]='1';
            a[len]='1';
            a[len+1]='\0';
        
        else
            for(i=0;i<len/2;i++)
                if(a[i]!=a[len-1-i])               //check if number is already palindrome
                    break;
                
            
            if(i==len/2)                           //add 1 if it is already palindrome
                j=len-1;
                while(1)
                    nj=((int)a[j])-48;
                    nj++;
                    if(nj<10)
                        a[j]=nj+48;
                        break;
                    
                    else
                        a[j]=48;
                        j--;
                    
                
            
            for(i=0;i<len/2;i++)
                if(a[i]==a[k])                 //compare first with last,second with second last...
                    k--;
                
                else
                    nk=((int)a[k])-48;
                    ni=((int)a[i])-48;
                    if(nk<ni)

                        a[k]=ni+48;

                    
                    else
                        j=k;    a[j]=ni+48; j--;
                        while(1)
                            nj=((int)a[j])-48;
                            nj++;
                            if(nj<10)
                                a[j]=nj+48;
                                break;
                            
                            else
                                a[j]=48;
                                j--;
                            
                        
                        if(j<=i)
                            i=j-1;
                            k=len-j;
                        
                    
                    k--;
                
            
            if(len%2==0)
                a[len/2]=a[len/2-1];
            
        
        cout<<a<<endl;
    
    return 0;

我的代码对于我尝试过的所有输入都运行良好,但它没有被接受。我的代码对吗?

【问题讨论】:

这么简单的任务有很多代码,您很可能应该考虑另一种方法。并且不要包含stdc++ (***.com/questions/31816095/…)。实际上,如果它有效,这甚至可能是它不被接受的原因。更有意义的变量名会让这更容易理解。 请给法官链接好吗? 法官给出的结果是什么? 是 WA 还是任何其他(运行时)错误? 它显示的是 WA。问题是spoj.com/problems/PALIN 【参考方案1】:

此代码可能被拒绝的一些原因是:

代码长度:找到大于给定输入的最小回文数可以用大量更少的代码来完成。 内存效率:对于可以轻松就地完成的操作来说,~1MB 的内存实在是太多了。所需的总内存只是数字的大小加上一些额外的整数变量。 运行时效率:这个问题可以在O(n)中解决,其中n是数字的位数。我不太明白你的代码的工作方式——老实说,我不会花任何精力去理解这种混乱——但这看起来并不完全是线性的(甚至不接近线性)。 #include &lt;bits/stdc++.h&gt;: 这个头文件是 GNU 特定的,编译器特定的,...。如果测试人员使用其他编译器,此代码甚至可能无法编译。除此之外,与仅包含所需的头文件相比,编译此头文件需要更多时间,并且会产生更大的可执行文件。 here 以更广泛的方式描述了使用此标头是一个坏主意的原因。

我只能推测解决方案确实被拒绝的原因。回答这个问题所需的最少信息是指向拒绝它的法官的链接 - 这也应该给出一个为什么它被拒绝的原因。

【讨论】:

你提到的原因无关紧要。 1. 代码长度不大,完全在文件大小限制之下。 2.正如代码所示,输入的数字不是整数而是字符串,用户输入为char[],即。输入的位数必须在 10^6 左右。 3. 他的解决方案的运行时效率是 O(n)。你自己看。 4. 不包含此头文件的原因有很多,但在我了解它的缺点之前,我的许多解决方案已被许多在线评委接受。 @vish4071 正如我在最后所说的:这只是推测。 OP 甚至没有提供法官或任务本身的链接,因此这些只是猜测。至于第 2 点,与 OP 的问题相同:信息太少,只是一个猜测。第3点:是的,你是对的。我只是对那一堆乱七八糟的变量和循环感到有些困惑。第 4 点:正如我所说,这取决于法官政策及其编译器。 终于被录取了。我在代码中删除了显式类型转换,因为它们是不必要的,并直接比较了数组元素。也许,这就是问题所在。感谢您的回答。

以上是关于寻找下一个回文的主要内容,如果未能解决你的问题,请参考以下文章

寻找最大回文字符串: Manacher算法详解

寻找最长回文子串

寻找最长回文子串

Python - 寻找回文数字的一个函数实现

Python - 寻找回文数字的一个函数实现

LeetCode 564.寻找最近的回文数