找到下一个回文

时间:2016-01-31 19:54:18

标签: 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;
}

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

1 个答案:

答案 0 :(得分:1)

此代码可能被拒绝的部分原因是:

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

我只能推测解决方案真正被拒绝的原因。回答这个问题所需的最少信息将是拒绝它的法官的链接 - 这应该提供一个理由为什么它被拒绝。