【左程云算法全讲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.hqwc.cn/news/174105.html

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

相关文章

Java进阶(垃圾回收GC)——理论篇:JVM内存模型 垃圾回收定位清除算法 JVM中的垃圾回收器

前言 JVM作为Java进阶的知识&#xff0c;是需要Java程序员不断深度和理解的。 本篇博客介绍JVM的内存模型&#xff0c;对比了1.7和1.8的内存模型的变化&#xff1b;介绍了垃圾回收的语言发展&#xff1b;阐述了定位垃圾的方法&#xff0c;引用计数法和可达性分析发以及垃圾清…

使用阿里云服务器学习Docker

首先我这里选择的系统服务器是CentOS 7.9 64位 因为centos系统里面的安装指令是&#xff1a;yum,而非apt-get. yum install docker -y试着建立一个容器&#xff1a; docker run -d -p 80:80 httpd启动docker的守护进程&#xff1a; sudo systemctl start docker 查看Docke…

一张图搞懂什么是BCD8421编码

如图所示 BCD8421编码的意义是 用四位二进制数表达一位的十进制数 因此十进制下的0&#xff5e;9在BCD8421编码下与其二进制表达是一样的 而多位的十进制数 比如说“10” 则需要将它拆分成两个单独的数“1”和“0” 分别用BCD8421编码表示这两个数 十进制“1” -> 0001 十进…

快速掌握队列的基础知识

目录 队列的特点基于链表实现队列用栈实现队列用队列实现栈 队列是一种线性数据结构&#xff0c;它只允许在一边进行插入操作&#xff08;队尾&#xff09;&#xff0c;另一边进行删除操作&#xff08;队头&#xff09;。插入操作称为入队&#xff0c;删除操作称为出队。队列遵…

代理模式-静态动态代理-jdk动态代理-cglib动态代理

代理模式 静态代理 动态代理&#xff1a;jdk动态代理 cglib动态代理 注意 &#xff1a;下面的代码截图 要配合文字去看 我对代码的每一步都做了解释 所以需要配合图片观看提取吗1111https://pan.baidu.com/s/1OxQSwbQ--t5Zvmwzjh1T0A?pwd1111 这里直接把项目文件 及代码 …

分布式数据库Schema 变更 in F1 TiDB

分布式数据库Schema 变更 in F1 & TiDB 【转载】TiDB 源码阅读系列文章&#xff08;十七&#xff09;DDL 源码解析 | PingCAP 上述文章主要叙述了从DDL语句发起到执行的过程&#xff0c;简单介绍了弄一套相同的模式来后台处理数据回填&#xff0c;从而提高DDL的并发度的一…

K8S容器内安装cur/telnet命令(Alpine Linux离线环境安装curl/telnet或其他工具)

背景 需求&#xff1a; 微服务的基础是镜像&#xff0c;通常在最小化的Linux镜像中安装jdk&#xff0c;然后运行编译好的java程序。将镜像运行到K8S上就得到了微服务Pod&#xff0c;Pod通常使用安装K8S时配置的私有网段&#xff0c;与宿主机不同。很多时候需要排查从Pod网段内…

python用pychart库,实现将经纬度信息在地图上显示

python使用pyecharts对给到的经纬度数据进行位置标注&#xff0c;下面是批量更新。给入数据&#xff0c;将地图生成。实验数据在下面附件。 from pyecharts import options as opts from pyecharts.charts import Geo import osfolder_path F:\\GPS file_names os.listdir(f…

ansible-第二天

ansible 第二天 以上学习了ping、command、shell、script模块&#xff0c;但一般不建议使用以上三个&#xff0c;因为这三个模块没有幂等性。举例如下&#xff1a; [rootcontrol ansible]# ansible test -a "mkdir /tmp/1234"[WARNING]: Consider using the file …

Java怎么对复杂的数据类型排序和比大小

目录 一.对复杂的数据类型比大小 Comparable接口 compareTo方法 二.对复杂数据类型排序 三.总结 一.对复杂的数据类型比大小 假如我们现在有个学生类&#xff0c;并且我们实例化出了俩个学生对象&#xff0c;他们各自有各自的名字和年龄属性&#xff0c;我们如何对他们进…

多篇论文介绍-DSConv-原文

论文地址 https://arxiv.org/pdf/1901.01928v1.pdf 目录 01 改进 YOLOv5的交通灯实时检测鲁棒算法 01 作用 02 模型介绍 02 基于改进YOLOv7一tiny 算法的输电线路螺栓缺销检测 01 作用 02 模型介绍 03 结合注意力机制的 &#xff39;&#xff2f;&#xff2c;&#xff2…

计算机服务器中了mallox勒索病毒怎么解决,勒索病毒解密,数据恢复

企业的计算机服务器为企业的数据存储提供了极大便利&#xff0c;也让企业的生产运行效率得到了极大提升&#xff0c;但是网络数据安全威胁随着技术的不断发展也不断增加。近期&#xff0c;云天数据恢复中心接到很多企业的求助&#xff0c;企业的计算机服务器遭到了mallox勒索病…