【左程云算法全讲10】打表技巧和矩阵处理技巧

系列综述:
💞目的:本系列是个人整理为了秋招面试的,整理期间苛求每个知识点,平衡理解简易度与深入程度。
🥰来源:材料主要源于左程云算法课程进行的,每个知识点的修正和深入主要参考各平台大佬的文章,其中也可能含有少量的个人实验自证。
🤭结语:如果有帮到你的地方,就点个赞关注一下呗,谢谢🎈🎄🌷!!!
🌈【C++】秋招&实习面经汇总篇


文章目录

      • 打表法
      • 矩阵处理
    • 参考博客


😊点此到文末惊喜↩︎

打表法

  1. 打表

    • 作用:如果程序的值具有固定可接受的范围,可以通过计算每个值对应解,并形成一张表。从而提高计算速度
    • 方法:通过暴力方法打印尽可能多组映射示例,然后针对这多组映射示例推导规律,定制简单的算法
    • 方向
      • 笔试打表:可以直接通过5个左右的示例进行纸上暴力手动打表,找不出来再代码打表
      • 面试/工作:向面试官讲明原理,然后表示自己会进行完整的测试
    • 特点:
      • 输入参数类型简单,并且只有一个实际参数
      • 返回值类型简单,并且只有一个
      • 通过暴力方法将输入与返回值的对应关系打印出来,并优化
    • 步骤:
      • 编写简单的暴力方法,并打印多组示例的对应关系
      • 针对该多组示例的对应关系进行规律的查找,然后面向规律编程
  2. 打表法示例1

    • 小虎去买苹果,商店只提供两种类型的塑料袋,每种类型都有任意数量。
      • 1)能装下6个苹果的袋子
      • 2)能装下8个苹果的袋子
    • 小虎可以自由使用两种袋子来装苹果,但是小虎有强迫症,他要求自己使用的袋子数量必须最少,且使用的每个袋子必须装满。
    • 给定一个正整数N,返回至少使用多少袋子。如果N无法让使用的每个袋子必须装满,否则返回-1
  3. 打表法示例2

    • 定义一种数:可以表示成若干(数量>1)连续正数和的数,比如:
      • 5= 2+3, 5就是这样的数
      • 12 = 3+4+5, 12就是这样的数
      • 1不是这样的数,因为要求数量大于1个、连续正数和
      • 2= 1 + 1,2也不是,因为等号右边不是连续正数
    • 给定一个参数N,返回是不是可以表示成若干连续正数和的数
      在这里插入图片描述
    • 判断num是不是2的某次方
      • (num & (num - 1)) == 0是2的某次方
      • (num & (num - 1)) !=0不是2的某次方

矩阵处理

  1. 矩阵特殊轨迹问题
    • 宏观调度法:
  2. 示例1:zigzag打印矩阵
    • 将打印轨迹进行分解:实际是每次打印一条A点和B点之间的斜线
      在这里插入图片描述
void printMatrixZigZag(vector<vector<int>> matrix) {// 打印斜线auto print_bias = [&matrix](int Ar, int Ac, int Br, int Bc, bool direction) {if(direction) {while(Ar!=Br+1) {cout << matrix[Ar++][Ac--] << " ";}}else {while(Br!=Ar-1) {cout << matrix[Br--][Bc++] << " ";}}};// 主函数部分int Ar = 0;// A点和B点的坐标int Ac = 0;int Br = 0;int Bc = 0;int endR = matrix.size()-1;   // 边界int endC = matrix[0].size()-1;bool fromUp = false;while(Ar != endR+1) { // 结束条件:A的行坐标为下边界值+1print_bias(Ar,Ac,Br,Bc,fromUp);Ar = Ac==endC?Ar+1:Ar;  // A点到最后一列时,Ar开始下移Ac = Ac==endC?Ac:Ac+1;  // A点没到最后一列时,Ac右移Bc = Br==endR?Bc+1:Bc;  Br = Br==endR?Br:Br+1;fromUp = !fromUp;       // 方向交叉}
}
  1. 示例2:转圈打印矩阵
    • 子过程:每次顺时针打印一圈,
template<typename T>
void pirntEdage(std::vector<std::vector<T>>& my_matrix, int tR, int tC, int dR, int dC) {if (tR == dR) { 		// 行相同for (int i = tC; i <= dC; ++i) {std::cout << my_matrix[tR][i] << ",";}} else if (tC == dC) {  // 列相同for (int i = tR; i <= dR; ++i) {std::cout << my_matrix[i][tC] << ",";}} else {    			// 打印四条边int curR = tR;int curC = tC;while (curC != dC) {std::cout << my_matrix[tR][curC] << ",";++curC;}while (curR != dR) {std::cout << my_matrix[curR][dC] << ",";++curR;}while (curC != tC) {std::cout << my_matrix[dR][curC] << ",";--curC;}while (curR != tR) {std::cout << my_matrix[curR][tC] << ",";--curR;}}
}template<typename T>
void spiralOrderPrint(std::vector<std::vector<T>>& my_matrix) {int tR = 0;int tC = 0;int dR = my_matrix.size() - 1;int dC = my_matrix[0].size() - 1;while (tR <= dR && tC <= dC) {pirntEdage(my_matrix, tR++, tC++, dR--, dC--);}
}
  1. 示例2:原地旋转正方形矩阵
    • 子过程:每次旋转一层
void Rotate(vector<vector<int>> matrix) {// 旋转一圈auto rotate_edge = [&matrix](int a, int b, int c, int d){int tmp = 0;// 每一圈一共执行d-b次// 每次顺时针交互对应的四个元素for (int i = 0; i < d-b; ++i) {tmp = matrix[a][b+i];matrix[a][b+i] = matrix[c-i][b];matrix[c-i][b] = matrix[c][d-i];matrix[c][d-i] = matrix[a+i][d];matrix[a+i][d] = tmp;} };// 主逻辑int a = 0;int b = 0;int c = matrix.size()-1;int d = matrix[0].size()-1;while (a < c) {rotate_edge(matrix, ++a, ++b, --c, --d);}
}


少年,我观你骨骼清奇,颖悟绝伦,必成人中龙凤。
不如点赞·收藏·关注一波

🚩点此跳转到首行↩︎

参考博客

  1. 转圈打印矩阵
  2. 待定引用
  3. 待定引用
  4. 待定引用

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/142548.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

冲击900亿美元估值!邀约路演、秘密交表的Shein上市有望

双十一的狂欢刚刚结束&#xff0c;Shein即将赴美上市的消息又在电商圈里投下一枚重磅炸弹。 继被媒体曝光其寻求900亿美金估值后&#xff0c;最新的消息称其已邀请投资人参与路演&#xff0c;且已秘密完成交表。这个神秘的中国独角兽&#xff0c;离敲钟登陆美股的日子越来越近…

SoftwareTest6 - 用 Selenium 怎么点点点

用 Selenium 来点点点 一 . 什么是自动化 ?1.1 自动化测试的分类接口自动化测试UI 自动化测试 (界面测试) 1.2 实现自动化测试的工具 : selenium环境部署驱动 二 . selenium 的使用2.1 一个简单的示例 : 让谷歌浏览器在百度首页搜索蔡徐坤准备工作编写代码 2.2 打开谷歌浏览器…

【vue】AntDV组件库中a-upload实现文件上传:

文章目录 一、文档&#xff1a;二、使用(以Jeecg为例)&#xff1a;【1】template&#xff1a;【2】script&#xff1a; 三、效果图&#xff1a; 一、文档&#xff1a; Upload 上传–Ant Design Vue 二、使用(以Jeecg为例)&#xff1a; 【1】template&#xff1a; <a-uploa…

day08_子网划分与子网掩码

什么是子网划分? 1、概念&#xff1a;借主机位给网络位使用,以此来达到把一个大网段划分为n个儿子网段的目的&#xff0c;2. 为何要进行子网划分&#xff1f;3、子网掩码&#xff1a;就是对ip地址打记号4、 网络地址的计算机方式&#xff1a;ip地址与子网掩码都转换成二进制&a…

基于51单片机PCF8591数字电压表数码管显示设计( proteus仿真+程序+设计报告+讲解视频)

PCF8591数字电压表数码管显示 1.主要功能&#xff1a;讲解视频&#xff1a;2.仿真3. 程序代码4. 设计报告5. 设计资料内容清单&&下载链接资料下载链接&#xff08;可点击&#xff09;&#xff1a; 基于51单片机PCF8591数字电压表数码管设计( proteus仿真程序设计报告讲…

Vue3-TypeScript-Threejs:导入外部的glb格式3D模型

一、直接上代码&#xff0c;在vue3-typescript-threejs 项目 导入外部的glb格式3D模型 极简代码&#xff0c;快速理解 <template><div ref"container"></div></template><script lang"ts" setup>import { onMounted, ref …

IEEE--DSConv: Efficient Convolution Operator 论文翻译

论文地址:https://arxiv.org/pdf/1901.01928v1.pdf 目录 摘要 1 介绍 2 相关工作 3 DSConv层 4 量化过程 5 分布偏移 6 优化推断 7 训练 8 结果 8.1 ImageNet 8.2 内存和计算负载 8.3 转移性 9 结论 摘要 我们引入了一种卷积层的变体&#xff0c;称为DSConv&…

cmd打开idea

当我们用idea打开一个项目的时候&#xff0c;有时候这个项目目录是有的&#xff0c;但是用idea的open却找不到&#xff0c;有时候我要重新关闭窗口&#xff0c;再open好多次才有 于是我现在使用命令打开&#xff0c;先把idea安装路径的bin目录放在path里面 然后cd到项目路径&…

Linux操作系统使用及C高级编程-D3Linux shell命令(权限、输入输出)

Shell 是一种应用程序&#xff0c;用以完成用户与内核之间的交互 一个功能强大的编程语言&#xff08;C语言&#xff09; 一个解释执行的脚本语言&#xff0c;不需要编译&#xff0c;写完直接执行 目前Linux 乌班图的Shell默认是bash 查看当前提供的Shell&#xff1a;cat /…

Tomcat隐藏版本号和关闭默认管理页面

一. 隐藏Tomcat异常页面中的版本信息&#xff0c;Tomcat服务器版本号泄露 Tomcat/8.5.xx相关版本号等信息&#xff0c;是不安全的。这会被黑客获取到&#xff0c;利用该版本的其他漏洞对服务器进行异常操作&#xff0c;所以需要隐藏掉。 进入tomcat安装目录 apache-tomcat-8.…

如何修改文件的修改时间?

如何修改文件的修改时间&#xff1f;随着当代社会科技的不断进步&#xff0c;我们对信息和数据的依赖程度与日俱增。在这个信息化时代&#xff0c;文件处理已经成为数字化办公中不可或缺的一部分。文件处理的范围非常广&#xff0c;其中有一个比较冷门的操作技巧&#xff0c;那…

《QT从基础到进阶·二十三》弹窗提示框QMessageBox和QCloseEvent事件

1、正常信息提示 QMessageBox::information(NULL, "Title", "Content", QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes);消息框按钮判断&#xff1a; if(QMessageBox::Ok QMessageBox::warning(this,"温馨提示","是否保存设置?…

智慧工地管理云平台源码,Spring Cloud +Vue+UniApp

智慧工地源码 智慧工地云平台源码 智慧建筑源码支持私有化部署&#xff0c;提供SaaS硬件设备运维全套服务。 互联网建筑工地&#xff0c;是将互联网的理念和技术引入建筑工地&#xff0c;从施工现场源头抓起&#xff0c;最大程度的收集人员、安全、环境、材料等关键业务数据&am…

光纤网络排障分析

日常工作中&#xff0c;发现某条光链路连接不稳定&#xff0c;时快时慢、时断时连。 在交换机上直接查看这条链路交换口上的光收发功率&#xff0c;发现异常。 简单说明下&#xff0c;RX Power代表光模块接收功率&#xff0c;TX Power代表发送功率。 引起这种故障的原因很多&a…

Java实现身份证号校验,最后一位校验码校验

中国居民身份证号码编码规则 第一、二位表示省&#xff08;自治区、直辖市、特别行政区&#xff09;。 第三、四位表示市&#xff08;地级市、自治州、盟及国家直辖市所属市辖区和县的汇总码&#xff09;。其中&#xff0c;01-20&#xff0c;51-70表示省直辖市&#xff1b;21-5…

Elasticsearch 面试题

文章目录 Elasticsearch 读取数据您能解释一下 X-Pack for Elasticsearch 的功能和重要性吗&#xff1f;Elasticsearch 中的节点&#xff08;比如共 20 个&#xff09;&#xff0c;其中的 10 个选了 一个master&#xff0c;另外 10 个选了另一个 master&#xff0c;怎么办&…

嵌入式杂记 -- MCU的大小端模式

MCU的大小端模式 大端模式小端模式大小端模式测试联合体概念MCU大小端模式测试大端模式测试小端模式测试 大小端模式转换 在进行MCU开发的时候&#xff0c;我们需要注意MCU的数据存储模式&#xff0c;在嵌入式中有两种不同的存储模式&#xff0c;分别是 大端模式和小端模式。 …

Linux 函数库

函数库&#xff1a; 我们的C程序中&#xff0c;并没有定义“printf”的函数实现,且在预编译中包含的“stdio.h”中也只有该函数的声明,而没有定义函数的实现,那么,是在哪里实“printf”函数的呢? 最后的答案是:系统把这些函数实现都被做到名为 libc.so.6 的库文件中去…

数据结构 | 带头双向循环链表专题

数据结构 | 带头双向循环链表专题 前言 前面我们学了单链表&#xff0c;我们这次来看一个专题带头的双向循环链表~~ 文章目录 数据结构 | 带头双向循环链表专题前言带头双向循环链表的结构实现双向链表头文件的定义哨兵位初始化创建节点尾插尾删头插头删打印查找指定位置前插入…

揭秘视频号创作者分成计划,带你玩赚视频号流量主,保姆级教程

项目介绍 今天给大家分享一个视频号流量主的一个项目&#xff0c;也就是视频号创作者广告分成计划。这个项目在目前来说是一个蓝海赛道&#xff0c;做的人是比较少&#xff0c;作为副业来说还是非常适合个人来做的。如果大家有工作室的话&#xff0c;也可以进行批量操作&#…