(nice!!!)(LeetCode 每日一题) 2081. k 镜像数字的和 (枚举)
题目:2081. k 镜像数字的和
思路:枚举10进制的回文串,然后来判断对应的k进制数是否是回文串。直到有n个满意即可。
而枚举10进制的回文串,从基数p(1、10、100… )开始,长度为奇数的回文串,长度为偶数的回文串。
class Solution {
public:typedef long long LL;//判断十进制u对应的k进制是否是回文串bool pd(LL u,int k){//因为最高位不可能为0,所以当最低为为0时,不合法if(u%k==0) return false;//十进制u变为k进制数的字符串string s="";while(u>0){s.push_back(u%k+'0');u/=k;}//双指针判断是否为回文串int l=0,r=s.size()-1;while(l<r){if(s[l]!=s[r]) return false;l++;r--;}return true;}long long kMirror(int k, int n) {LL sum=0;int ans=0;// 基数从1开始,[1,10)、[10,99)...for(int p=1;;p*=10){// 长度为奇数个的字符串 for(int i=p;i<p*10;i++){LL t=i;//从i/10开始,也就是最低位不要for(int x=i/10;x>0;x/=10){t=t*10+x%10;}//判断对应的k进制是否是回文串if(pd(t,k)){cout<<t<<endl;ans++;sum+=t;}if(ans==n) return sum;}// 长度为偶数个的字符串 for(int i=p;i<p*10;i++){LL t=i;for(int x=i;x>0;x/=10){t=t*10+x%10;}//判断对应的k进制是否是回文串if(pd(t,k)){cout<<t<<endl;ans++;sum+=t;}if(ans==n) return sum;}}return 0;}
};