c++ - 找到下一个回文

标签 c++ algorithm palindrome

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

#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;
}

我的代码对于我尝试过的所有输入都工作正常,但没有被接受。我的代码正确吗?

最佳答案

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

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

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

关于c++ - 找到下一个回文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35118670/

相关文章:

c++ - 有人可以解释关于异常的右值引用吗?

sql-server - 同步桌面应用程序的数据库设计

palindrome - 使用lcs的最长回文子串?

python - 如何检查最大可能的回文整数

c++ - 使用 Boost Spirit 匹配字符串

c++ - 如何计算 dmg 文件的 MasterChecksum 和 DataForkChecksum

c++ - std::greater 未在 MSVC2012 中定义

algorithm - 如何从一百万条数据记录中快速获取最近的100个点?

algorithm - 分组集算法

c++ - 看不懂回文中的简写代码