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

news2024/11/24 20:34:59

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

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

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

相关文章

算法笔记-其他高效的技巧与算法(未处理完)

算法笔记-其他高效的技巧与算法 前缀和 前缀和 #include <cstdio> #include <vector> using namespace std; const int MAXN 10000; int n, a[MAXN]; int sum[MAXN] { 0 };int main() {scanf("%d", &n);for (int i 0; i < n; i) {scanf("…

数据银行:安全保障的重要一环

随着信息技术的快速发展&#xff0c;数据银行已经成为了我们日常生活中不可或缺的一部分。它存储了我们的个人信息、财务数据、医疗记录等重要信息&#xff0c;这些信息对于我们的生活和工作至关重要。然而&#xff0c;由于数据的安全性备受关注&#xff0c;因此&#xff0c;对…

JavaWeb——HTML常用标签

目录 1. 标题标签 2. 段落标签 3. 换行/分割线标签 4. 列表标签 4.1. 有序列表 4.2. 无序列表 5. 超链接标签 6. 多媒体标签 6.1. img 图片标签 6.2. audio 音频标签 6.3. video 视频标签 7. 表格标签(重点) 8. 表单标签&#xff08;重点&#xff09; 1. 标题标签 …

【unity插件】UGUI的粒子效果(UI粒子)—— Particle Effect For UGUI (UI Particle)

文章目录 前言插件地址描述特征Demo 演示如何玩演示对于 Unity 2019.1 或更高版本对于 Unity 2018.4 或更早版本 用法基本上是用法使用您现有的 ParticleSystem 预制件带 Mask 或 RectMask2D 组件脚本用法UIParticleAttractor 组件开发说明常见问题解答&#xff1a;为什么我的粒…

计算机组成原理——指令系统题库21-40

21、假定指令地址码给出的是操作数的存储地址&#xff0c;则该操作数采用的是什么寻址。 A、 立即    B、 直接     C、 基址     D、 相对 22、寄存器间接寻址方式的操作数存储在什么中 A、 通用寄存器    B、 存储单元     C、 程序计数器     …

error: C3867: “MainWindow::copyFileCallBack”: 非标准语法;请使用 ““

error: C3867: “MainWindow::copyFileCallBack”: 非标准语法&#xff1b;请使用 “&” 这时候我们按照提示将t.testFun前面加上&又会出现error C2276: “&”: 绑定成员函数表达式上的非法操作&#xff0c; 解决 在函数前面加上static声明

MySQL(16):变量、流程控制与游标

变量 在MySQL数据库的存储过程和函数中&#xff0c;可以使用变量来存储查询或计算的中间结果数据&#xff0c;或者输出最终的结果数据。 在 MySQL 数据库中&#xff0c;变量分为 系统变量 以及 用户自定义变量 。 系统变量 变量由系统定义&#xff0c;不是用户定义&#xff…

缩点+图论路径网络流:1114T4

http://cplusoj.com/d/senior/p/SS231114D 重新梳理一下题目 我们先建图 x → y x\to y x→y&#xff0c;然后对点分类&#xff1a;原串出现点&#xff0c;原串未出现点。 假如我们对一个原串出现点进行了操作&#xff0c;那么它剩余所有出边我们立刻去操作必然没有影响。所…

由于找不到msvcp140.dll无法继续执行代码有哪些解决方法

msvcp140.dll是Microsoft Visual C 2015 Redistributable的一个组件&#xff0c;它是运行许多Windows应用程序所必需的。当msvcp140.dll丢失或损坏时&#xff0c;可能会导致以下问题&#xff1a; 1. 程序无法启动或崩溃。 2. 系统出现错误提示&#xff0c;如“找不到msvcp140…

SQL-LABS

less8 and 11-- 12 发现存在注入点 接下来我们会接着用联合查询 和以往的题目不一样没显错位&#xff0c;也就是没有报错的内容&#xff0c;尝试用盲注 布尔型 length&#xff08;&#xff09;返回长度 substr&#xff08;&#xff09;截取字符串&#xff08;语法substr&a…

取消Element UI响应式设计——打造固定布局的菜单

引言 在当今的Web开发中&#xff0c;响应式设计已经成为了一个不可或缺的部分。然而&#xff0c;有时候我们可能需要取消这种响应式特性&#xff0c;尤其是对于一些特定的界面元素&#xff0c;如导航菜单。在Element UI框架中&#xff0c;导航菜单&#xff08;el-menu&#xff…

c++范围for语句

语法格式 for(declaration:expression)statement 基本使用 遍历输出 vector<int> nums { 1,2,3,4,5}; for (int num : nums) {num;cout << num << " "; } cout << endl; 遍历时修改 vector<int> nums { 1,2,3,4,5}; for (int&…

软件外包的需求整理技巧

在软件开发中&#xff0c;整理需求是确保项目成功的重要步骤之一。以下是一些整理需求的技巧&#xff0c;这些技巧有助于确保需求的清晰性、完整性和可行性&#xff0c;为项目的成功打下坚实的基础。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢…

clickhouse的安装和配置

使用虚拟机测试, 系统为ubuntu 22.04 一 安装 sudo apt-get install -y apt-transport-https ca-certificates dirmngr sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 8919F6BD2B48D754echo "deb https://packages.clickhouse.com/deb stable ma…

单链表经典OJ题(三)

目录 1、反转链表 2、合并两个有序链表 3、链表的中间结点 4、环形链表的约瑟夫问题 5、移除链表元素 6、移除元素 1、反转链表 206. 反转链表 - 力扣&#xff08;LeetCode&#xff09; 翻转链表的实质就是更改当前结点的前驱结点和后继结点 假设原链表为:1->2->…

能链智电的野心,充电桩装不下

作者 | 张未 来源 | 洞见新研社 从油到电&#xff0c;从平台到资产运营方&#xff0c;从国内到国外&#xff0c;能链智电的野心&#xff0c;充电桩装不下。 “充电桩服务第一股”能链智电&#xff0c;曾作为平台型企业&#xff0c;连接了充电桩上下游&#xff0c;为充电桩制造…

王道数据结构课后代码题p19 第14题请设计一个尽可能高效的算法,计算并输出所有可能的三元组(a,b,c) 中的最小距离。(c语言代码实现)

本题其实就是找a到c的最小值 有讲解p19 第14题 c语言实现王道数据结构课后代码题_哔哩哔哩_bilibili 下方有图&#xff1a; 本题代码如下 int abs(int a)//计算绝对值 {if (a < 0)return -a;elsereturn a; } int min(int a, int b, int c)//a是否为三个数中的最小值 {if …

hash算法

一、Hash散列算法介绍 1.引言 每个人在这个社会上生存&#xff0c;都会有一个属于自己的标记&#xff0c;用于区分不同的个体。通常使用名字就可以了。但是一个名字也并不能完全表示一个人&#xff0c;因为重名的人很多。所以我们可以使用一个身份证号或者指纹来表示独一无二…

当酱香碰上科技,茅台渴望的未来不仅仅是“加钱”

作者 | 曾响铃 文 | 响铃说 又涨价了。2023年11月1日起&#xff0c;贵州茅台宣布旗下53%vol茅台酒&#xff08;飞天、五星&#xff09;的出厂价格平均将上调20%&#xff0c;这也是茅台自2018年1月以来&#xff0c;近六年后再次迎来调整。 不过略有不同的是&#xff0c;本轮零…