【左程云算法全讲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的行坐标为下边界值+1
    print_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. 待定引用

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【LeetCode刷题-双指针】--80.删除有序数组中的重复项II

80.删除有序数组中的重复项II 方法&#xff1a;双指针 因为给定数组是有序的&#xff0c;所以相同元素必然连续&#xff0c;使用双指针解决&#xff0c;遍历数组检查每一个元素是否应该被保留&#xff0c;如果应该保留&#xff0c;就将其移动到指定位置。我们定义两个指针slow…

Python实现扫雷游戏,代码示例,边玩边学+回忆童年!

文章目录 前言实现总结关于Python技术储备一、Python所有方向的学习路线二、Python基础学习视频三、精品Python学习书籍四、Python工具包项目源码合集①Python工具包②Python实战案例③Python小游戏源码五、面试资料六、Python兼职渠道 前言 扫雷是一款益智类小游戏&#xff0…

使用vue2实现todolist待办事项

个人名片&#xff1a; &#x1f60a;作者简介&#xff1a;一名大二在校生 &#x1f921; 个人主页&#xff1a;坠入暮云间x &#x1f43c;座右铭&#xff1a;懒惰受到的惩罚不仅仅是自己的失败&#xff0c;还有别人的成功。 &#x1f385;**学习目标: 坚持每一次的学习打卡 文章…

解密N数之和问题的秘密

目录 两数之和三数之和 两数之和 我们来看力扣第一题 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是&#xff0c;数组中同一…

【MATLAB源码-第76期】基于matlab的OCDM系统在AWGN信道下理论误码率和实际误码率对比仿真。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 正交线性调频分频复用&#xff08;OCDM&#xff0c;Orthogonal Chirp Division Multiplexing&#xff09;是一种无线通信技术&#xff0c;它基于啁啾信号的原理。啁啾信号是一种频率随时间变化的信号&#xff0c;通常频率是线…

【Java】集合(三)Map

1.Map 接口实现类的特点 1)Map与Collection并列存在。用于保存具有映射关系的数据:Key-Value 2)Map 中的 key 和 value 可以是任何引用类型的数据&#xff0c;会封装到HashMap$Node对象中 3)Map 中的 key 不允许重复 4)Map 中的 value 可以重复 5)Map 的key 可以为 null,va…

执行力太差的人,如何才能提高执行力?

执行力是计划的落地执行&#xff0c;是按照计划稳步推进&#xff0c;导向结果的能力。不同的人&#xff0c;其执行力有很大的差别。比如说有拖延症的人&#xff0c;基本上是谈不上执行力的&#xff0c;执行力是一个综合体&#xff0c;是多个要素的共同作用。 在企业HR人才测评…

java实现快速排序

图解 快速排序是一种常见的排序算法&#xff0c;它通过选取一个基准元素&#xff0c;将待排序的数组划分为两个子数组&#xff0c;一个子数组中的元素都小于基准元素&#xff0c;另一个子数组中的元素都大于基准元素。然后递归地对子数组进行排序&#xff0c;直到子数组的长度为…

Flutter的Widget, Element, RenderObject的关系

在Flutter中&#xff0c;Widget&#xff0c;Element和RenderObject是三个核心的概念&#xff0c;它们共同构成了Flutter的渲染流程和组件树的基础。下面简要介绍它们之间的关系&#xff1a; 1.Widget Widget是Flutter应用中的基础构建块&#xff0c;是一个配置的描述&#xf…

基于ssm酒店管理系统

基于ssm酒店管理系统 摘要 基于SSM&#xff08;Spring Spring MVC MyBatis&#xff09;框架的酒店管理系统是一种利用现代化技术手段来提高酒店管理效率和服务质量的信息化管理系统。该系统整合了Spring框架的依赖注入、Spring MVC框架的请求处理和MyBatis框架的持久化操作&a…

50.批处理脚本(2/2)

目录 一、批处理命令。 &#xff08;1&#xff09;net use 连接共享文件夹或查看。 &#xff08;1.1&#xff09;连接共享文件夹。 &#xff08;1.2&#xff09;断开连接。 &#xff08;1.3&#xff09;显示当前连接。 &#xff08;1.4&#xff09;查看电脑的共享文件夹。…

基于SpringBoot+Vue的宿舍管理系统

基于SpringBootVue的学生宿舍管理系统的设计与实现~ 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringBootMyBatisVue工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 主页 宿舍公告 登录界面 管理员界面 维修人员 商家界面 学生界面 摘要 摘…

VS项目属性变量

VS项目属性变量 $(SolutionDir) 获取解决方案的路径 $(Platform) 平台名字 → x86 / x64 $(ProjectName) 工程名字 $(Configuration) 当前的项目模式 → Debug / Release

基于SSM+Vue的健身房管理系统

基于SSMVue的健身房管理系统的设计与实现~ 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringMyBatisSpringMVC工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 主页 课程信息 健身器材 管理员界面 用户界面 摘要 健身房管理系统是一种利用现…

腾讯云4核8G和2核4G服务器五年优惠价格表

腾讯云百科整理五年云服务器优惠活动 txybk.com/go/txy 配置可选2核4G和4核8G&#xff0c;公网带宽可选1M、3M或5M&#xff0c;系统盘为50G高性能云硬盘&#xff0c;标准型S5实例CPU采用主频2.5GHz的Intel Xeon Cascade Lake或者Intel Xeon Cooper Lake处理器&#xff0c;睿频3…

NOIP 2017 宝藏----Java题解

目录 NOIP 2017 宝藏 题目描述 输入描述: 输出描述: 输入 输出 说明 输入 输出 说明 备注: 代码实现&#xff1a; NOIP 2017 宝藏 时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 262144K&#xff0c;其他语言524288K 64bit IO For…

viple模拟器使用(一):线控模拟

(1)unity模拟器 通过viple程序&#xff0c;将viple编写逻辑运行在unity模拟器中。 首先编写viple程序&#xff0c;逻辑&#xff1a;设置一个机器人主机&#xff0c;并且&#xff0c;按↑、↓、←、→方向键的时候&#xff0c;能分别控制模拟机器人在unity模拟器中运行。 主机…

【Linux基础IO篇】深入理解文件系统、动静态库

【Linux基础IO篇】深入理解文件系统、动静态库 目录 【Linux基础IO篇】深入理解文件系统、动静态库再次理解文件系统操作系统内存管理模块&#xff08;基础&#xff09;操作系统如何管理内存 Linux中task_struct源码结构 动态库和静态库动静态库介绍&#xff1a;生成静态库库搜…

学Diffusion前需要储备的一些知识点

自学Diffusion是非常困难的&#xff0c;尤其是到了VAE和VI这里基本找不到比较好的中文资料&#xff0c;甚至是涉及到一些重参数化&#xff0c;高斯混合之类的问题摸不着来龙去脉。在本文中&#xff0c;基本不会涉及公式&#xff0c;只有intuition和理解&#xff0c;如果要看公式…

NC 56 单据接口报错排查一例

前言 自从公司的古董 NC ERP 接入了共享财务系统、我们就开始了漫长的排障生涯。下面分享一例接口数据报错的分析和处理方案。 操作环境 NC 客户端是 windows 的 V56 版本。生产环境数据库是 oracle 、数据库访问用了 PL/SQL。 验证过程 早上接到了共享财务系统的报错&…