当前位置: 首页 > news >正文

2081、k镜像数组的和

题目:

2<=k<=9        1<=n<=30

解答:

题目不难,但是比较复杂。首先缺人不能用遍历所有十进制数,判断其是否为10和k进制数的方法,时间必超;因此选择构造10进制回文数,判断其是否为k进制回文数

先编写函数解决一些工具性的问题。

计算k进制回文数

bool k_p_num(long long num,int k){if(num%k==0) return false;//判断是否满足k回文long long numtemp=num;long long p_num=0;while(num){p_num=p_num*k+num%k;num=num/k;}if(numtemp==p_num)return true;else return false;
}

构造十进制回文数

//构造n位的十进制回文数
long long p_num(long long num){//求十进制回文long long p_num = 0;while(num){p_num=p_num*10+num%10;num=num/10;}return p_num;
}

构造n位的数字,所有可能的10进制回文数,并判断其是否为k进制回文数

参数:n为当前构造的数字位数;rem_n为题目中的n的余量,即n-([1,n-1]所构造的满足十进制、k进制回文数的个数);k为进制

分n=1,n为非1奇数,n为偶数三种情况。

回文数左右对称,只需要遍历左边一串即可。奇数情况下还要考虑中间的数的情况。从小到大生成,假设左边的为3位,那么就是[100-999],右边用左边数的回文数即可,然后两个数加上奇数情况下的中间位进行从小到大的遍历,用10的次方加权去拼成需要构造的回文数即可。

//remk参:剩余的 n ,为 0 时break
vector<long long> palindromic_number(int n,int rem_n,int k){vector<long long> n_palindromic;//n为位数if(n==1) {for(int i=1;i<10;i++){if(k_p_num(i,k)){n_palindromic.push_back(i);rem_n--;if(rem_n==0) return n_palindromic;}}return n_palindromic;}//奇数//构造:n=5 为例 10001-99999//left:(10-99) right:0-9  left-right-leftelse if(n%2==1){for(long long left=pow(10,(n-1)/2-1);left<=pow(10,(n-1)/2)-1;left++){long long p_left=p_num(left);for(int right=0;right<=9;right++){//构造回文数://left    right    left回文//(n-1)/2   1     (n-1)/2  位数long long ans = left*pow(10,(n-1)/2+1)+right*pow(10,(n-1)/2)+p_left;if(k_p_num(ans,k)){//满足构造的ans为k回文数n_palindromic.push_back(ans);rem_n--;if(rem_n==0) return n_palindromic;}}}return n_palindromic;}else {for(long long i=pow(10,n/2-1);i<=pow(10,n/2)-1;i++){//构造回文数: i     i逆序//           n/2   n/2    //回文数=i*n/2位+i逆序=(i+1)*n/2位-1-i  long long p_i = p_num(i);long long ans = i*pow(10,n/2)+p_i;if(k_p_num(ans,k)){//满足构造的ans为k回文数n_palindromic.push_back(ans);rem_n--;if(rem_n==0) return n_palindromic;}}}return  n_palindromic;
}

 main:

class Solution {
public:long long kMirror(int k, int n) {int i=1;vector<long long> ans;while(n){vector<long long> temp=palindromic_number(i,n,k);n-=temp.size();ans.insert(ans.end(),temp.begin(),temp.end());i++;}long long ansall=0;int len = ans.size();for(int i=0;i<len;i++){ansall+=ans[i];}return ansall;}
};

复杂度是n、k的函数

相关文章:

  • 怎么做网站frontpageseo流量排名软件
  • 自己怎么做短视频网站网络推广和网站推广
  • 开网站赚50万做百度指数官方
  • 网站下载地址seo网站优化培训找哪些
  • 哪个素材网站做美工最好seo投放营销
  • 网站建设 自动生成天津抖音seo
  • linux-修改文件命令(补充)
  • Python-4-考试等级划分
  • SQL学习笔记2
  • 没有VISA怎么注册AWS?
  • 图灵完备之路(数电学习三分钟)----运算基础二
  • 解决git pull,push 每次操作输入账号密码问题
  • el-dropdown自定义“更多操作⌵”上下文关联按钮)下拉菜单
  • Python Matplotlib绘图指南,10分钟制作专业级数据可视化图表
  • 复盘与导出工具最新版V25.0版本更新--新增东方财富,指南针,同花顺远航版,金融大师联动
  • 求助deepsee 生成语法树代码
  • 详细讲解oracle的视图
  • 数字图像处理——物体识别和邻域运算的关系
  • 板凳-------Mysql cookbook学习 (十--10)
  • Java期末复习题(二)
  • Linux 内存管理之page cache
  • LOOP如何让长周期交互LLM代理在复杂环境中实现突破?
  • JSON框架转化isSuccess()为sucess字段
  • DataX(3)—— 核心流程源码
  • 计算机网络 网络层:数据平面(二)
  • 北斗导航 | 基于改进奇偶矢量法的CAT I精密进近RAIM算法