题解(保姆级)
2025-06-02 16:53:51
发布于:浙江
7阅读
0回复
0点赞
思路:本题就是让我们判断整数n在八进制下是否回文。那么我们就可以手搓两个函数。一个是进制转化的,另一个是判断回文串(数)的。先进行进制转换,之后存入字符串中判断即可。
代码(1):
#include <bits/stdc++.h>
using namespace std;
string n;
//进制转换
void m(int a){
if(a==0){
return ;
}
m(a/8);
n+=char('0'+a%8);
}//回文串判断
bool check(string n){
int num=n.size()-1;
for(int i=0;i<=n.size()-1;i++){
if(n[i]!=n[num]){
return false;
}num--;
}return true;
}
signed main(){
int a;
cin >> a;
if(a==0){
cout << "YES";
return 0;
}
m(a);
if(check(n))cout <<"YES";
else cout << "NO";
return 0;
}
方法二:什么,你说题目上写了双指针?我就不用
那我用一下。其实就是在判断回文串的时候改一改代码就行了

代码(双指针):
#include <bits/stdc++.h>
using namespace std;
string n;
//进制转换
void m(int a){
if(a==0){
return ;
}
m(a/8);
n+=char('0'+a%8);
}//回文串判断(双指针)
bool check(string n){
int i=0,j=n.size()-1;
while(i<=j){
if(n[i]!=n[j]){
return false;
}j--,i++;
}return true;
}
signed main(){
int a;
cin >> a;
if(a==0){
cout << "YES";
return 0;
}
m(a);
if(check(n))cout <<"YES";
else cout << "NO";
return 0;
}
其实就是把for改成while
时间复杂度分析:
进制转换的复杂度为,判断回文串的时间复杂度(第一种和第二种)分别为和。第一种方法是可以优化的。我就不这里就不优化了。
那么总体时间复杂度为。其中是八进制下n的长度。
这里空空如也
有帮助,赞一个