【问题标题】: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++ (stackoverflow.com/questions/31816095/…)。实际上,如果它有效,这甚至可能是它不被接受的原因。更有意义的变量名会让这更容易理解。
  • 请给法官链接好吗?
  • 法官给出的结果是什么?
  • 是 WA 还是任何其他(运行时)错误?
  • 它显示的是 WA。问题是spoj.com/problems/PALIN

标签: c++ algorithm palindrome


【解决方案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 点:正如我所说,这取决于法官政策及其编译器。
  • 终于被录取了。我在代码中删除了显式类型转换,因为它们是不必要的,并直接比较了数组元素。也许,这就是问题所在。感谢您的回答。
猜你喜欢
  • 2011-02-19
  • 1970-01-01
  • 2012-03-01
  • 2012-02-29
  • 2021-01-28
  • 2021-05-31
  • 2014-08-07
  • 2012-08-06
  • 1970-01-01
相关资源
最近更新 更多