给定一个数字,我试图找到大于给定数字的最小回文数。这是我的代码:
#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/