【刷题汇总--Fibonacci数列、单词搜索、杨辉三角】

C++日常刷题积累

  • 今日刷题汇总 - day004
    • 1、Fibonacci数列
      • 1.1、题目
      • 1.2、思路
      • 1.3、程序实现
    • 2、单词搜索
      • 2.1、题目
      • 2.2、思路
      • 2.3、程序实现
    • 3、杨辉三角
      • 3.1、题目
      • 3.2、思路
      • 3.3、程序实现 - 蛮力法
      • 3.4、程序实现 - vector
      • 3.5、程序实现 - dp
    • 4、题目链接

今日刷题汇总 - day004

1、Fibonacci数列

1.1、题目

在这里插入图片描述

1.2、思路

首先,读完题知道了要求,对输入的数值N操作++或–,使其变成一个斐波那契数的操作次数最小。那么斐波那契数众所周知相邻数之间具备一定的关系,即第三个数c = 第一个数a + 第二个数b;那么,我们输入的数值N肯定是在b和c之间或者正好是斐波那契数(可能不好理解,补充几句,斐波那契数列的规律是abc,abc,abc的迭代的,所以最先接触到输入值N的是c,所以肯定在b和c之间,而不会在a和b之间),故由最近的b和c与输入的数值N求的最小差就是最小操作的次数。接下来,就是程序实现。

1.3、程序实现

首先,按照题目要写好输入,以及定义斐波那契数的三个相邻数且从 0,1,1开始循环斐波那契数,直到把输入值n包括进b和c之间。最后求得最小差值即可。

#include <iostream>
using namespace std;int main()
{int n = 0;cin >> n;int a = 0;int b = 1;int c = 1;while(n > c){a= b;b = c;c = a+b;}cout << min(c - n, n - b) << endl;return 0;
}

在这里插入图片描述
在这里插入图片描述

2、单词搜索

2.1、题目

在这里插入图片描述

2.2、思路

首先,读完题目,知道了在一个二维字符数组中,进行查找相邻的元素组成需要的单词。其中,要求同一个字符元素只能用一次,即单向的拼接。那么,分析示例,可以想到遍历二维数组,当出现第一个与输入的单词首字母匹配时。执行查找相邻的字符元素执行拼接,如果这次拼接未完成,则继续遍历第二次出现,输入单词的首字母,再次执行查找拼接。遍历结束后,还是没有拼接成功,说明这组二维数组没有该单词。读懂了题,那么怎么来解决呢?思考后,这道题实际上考察的是深度优先搜索的方法。首先,我们先得知道二维数组vis得大小m行,n列,然后vis初始化为0表示未被搜索过,接着需要两个方向数组dx和dy,然后就可以遍历这个二维数组,当遍历到等于单词首字母word[0]时,执行深度优先搜索dfs,dfs查找匹配拼接成功就返回true,否则返回false,那么就继续遍历,依次类推,直到遍历结束。所以,我们还需要单独封装dfs函数。那么对于,dfs我们需要的参数是,这个二维数组board、当前遍历到的下标 i 和 j ,需要匹配拼接的单词,其次,还有已匹配至的位置pos,因为可能单词匹配一半就失败了,所以需要一个pos作为参数控制查找的边界。接下来具体,看看程序实现。

2.3、程序实现

首先,根据题目写好基本需求,定义bool类型的vis二维数组用于表示是否已经搜索,定义两个变量m,n计算输入二位字符数组的行、列,再定义dfs需要的方向数组dx,dy,然后写好两层for遍历匹配word[0]的程序,匹配就当前元素位置执行dfs搜索,如果遍历完都不匹配word[0],说明没有该单词。另外,值得注意的是,因为dfs也需要使用这些变量,所以定义为全局的更适用。

class Solution {int m,n;bool vis[101][101] = { 0 };int dx[4] = {0, 0, 1, -1};int dy[4] = {1, -1, 0, 0};public:bool exist(vector<string>& board, string word){m = board.size();n = board[0].size();for (int i = 0; i < m; i++){for (int j = 0; j < n; j++){if (board[i][j] == word[0]){if(dfs(board, i, j, word, 0)) return true;}}}return false;}
};

接着,就是根据题目规则,编写dfs函数,首先,能进入dfs执行查找,说明当前位置的字符元素下标 i 和 j 与word[0]是匹配的,所以vis[i][j] = true,标记被搜索了,接着我们去按照规则去当前标记处的上下左右4个方向去搜索匹配word[1]第二个字母,值得注意的是,我们需要约束查找的边界,比如当在vis[0][0]就匹配word[0]时,执行dfs如果四个方向都去查找的时候,发现,vis[0][0]的上方和左方不存在,所以类似的边界需要利用两个变量a和b控制,并且我们要保证下一次不会再次搜索同一位置!vis[a][b],而是去匹配word[pos + 1]单词的下一个位置字母。如果第二个字母也成功匹配了,继续递归dfs找匹配第三个字母,依次类推,直到查看当前pos是否是word的最后一个位置,如果是说明查找成功,拼接成功返回true,否则,不存在该单词或查找失败,返回false。值得注意的是,遍历结束后无法匹配,需要把vis[i][j] 置false表示取消标记,方便下次标记的使用.

class Solution {int m,n;bool vis[101][101] = { 0 };int dx[4] = {0, 0, 1, -1};int dy[4] = {1, -1, 0, 0};public:bool dfs(vector<string>& board, int i, int j, string& word, int pos){vis[i][j] = true;for (int k = 0; k < 4; k++){int a = i + dx[k], b = j + dy[k];if (a >= 0 && a < m && b >= 0 && b < n && !vis[a][b] && board[a][b]== word[pos + 1]){if (dfs(board, a, b, word, pos + 1))return true;}}if (pos == word.size() - 1){return true;}vis[i][j] = false;return false;}bool exist(vector<string>& board, string word){m = board.size();n = board[0].size();for (int i = 0; i < m; i++){for (int j = 0; j < n; j++){if (board[i][j] == word[0]){if(dfs(board, i, j, word, 0)) return true;}}}return false;}};

在这里插入图片描述

在这里插入图片描述

3、杨辉三角

3.1、题目

在这里插入图片描述

3.2、思路

读完题目,知道就是熟悉的杨辉三角,输入n表示输出几行的杨辉三角即可。杨辉三角的特点就是边界上全为1,且除第1,2层和边界元素外的元素 = 上层元素 + 上层元素前一个元素,即arr[i][j] = arr[i-1][j] + arr[i-] [j-1];那么比较简单那么就用三种方法实现,蛮力法、vector法以及dp法。说说后面两种思路即可。vector就是利用vector套一层vector组成二维数组,且方便利用resize初始化为1,然后结合杨辉三角的性质逐个相加即可,最好按照题目要求输出即可;dp线性问题,就巧妙了,直接把足够大二维数组初始化为0,然后从arr[1][1]开始填入杨辉三角,第几行就打印几列即可。接下来就是程序实现。

3.3、程序实现 - 蛮力法

首先,按照题目要求,写好输入n表示行,然后,定义一个二维数组arr符合题目范围即可,然后杨辉三角经典的两层for先写上,这里定义全局的 i 和 j 因为后续的打印也是两层遍历二维数组打印,所以全局更适用。值得注意的是,打印按照题目要求的格式5d打印一行且换行。

#include <iostream>
using namespace std;
int main()
{int n = 0;cin >> n;int arr[31][31];int i;int j;for (i = 0; i < n; i++){for (j = 0; j <= i; j++){}}for (i = 0; i < n; i++){for (j = 0; j <=i; j++)printf("%5d", arr[i][j]);printf("\n");}return 0;
}

接着,完善杨辉三角的性质,初始化第一列j = 0 和 i == j边界(斜边)等于1,套上“公式”arr[i][j] = arr[i - 1][j - 1] + arr[i - 1][j];即可。

#include <iostream>
using namespace std;
int main()
{int n = 0;cin >> n;int arr[31][31];int i;int j;for (i = 0; i < n; i++){for (j = 0; j <= i; j++){if (j == 0 || i == j){arr[i][j] = 1;}else{arr[i][j] = arr[i - 1][j - 1] + arr[i - 1][j];}}}for (i = 0; i < n; i++){for (j = 0; j <=i; j++)printf("%5d", arr[i][j]);printf("\n");}return 0;
}

在这里插入图片描述
在这里插入图片描述

3.4、程序实现 - vector

整体思路都差不多,vector主要是用一下vector的应用,主要可以概括为三步:
(1)、利用resize初始化二维数组vector<vector> vv(n);全是为1;
(2)、根据杨辉三角性质写好两层for循环;值得注意的是循环边界控制,从i=2第三行开始即可。
(3)、根据题目要求的格式打印即可。

#include <iostream>  
#include <vector>  
using namespace std;  int main()  
{  int n = 0;  cin >> n;  vector<vector<int>> vv(n);  for (int i = 0; i < n; i++)  {  vv[i].resize(i + 1, 1);  }  for (int i = 2; i < n; i++)  {  for (int j = 1; j < i; ++j)  {  vv[i][j] = vv[i - 1][j] + vv[i - 1][j - 1];  }  }  for(int i = 0; i < n; i++)  {  for(int j = 0; j <= i; j++)  {  printf("%5d", vv[i][j]);  }  printf("\n");  }  return 0;  
}

在这里插入图片描述
在这里插入图片描述

3.5、程序实现 - dp

线性dp就是利用把杨辉三角从arr[1][1]开始填入数据1,而不是从arr[0][0],因为这样就不用遍历使得边界初始化为1了。直接就可以集合杨辉三角的性质dp[i][j] = dp[i - 1][j] + dp[i - 1][j - 1];得到每一个数据。前提是数组满足题目范围足够大。为了方便理解画个图,以n=4为例观察。
在这里插入图片描述

此外,这里直接定义全局的数组dp,因为全局默认初始化为全0。值得注意的是dp优化后,打印二维数组从1开始。

#include <iostream>  
using namespace std;  int dp[31][31];int main()  
{  int n = 0;cin >> n;dp[1][1] = 1;for(int i = 2; i <= n; i++){for(int j = 1; j <= i; j++){dp[i][j] = dp[i - 1][j] + dp[i - 1][j - 1];}}for(int i = 1; i <= n; i++){for(int j = 1; j <= i; j++){printf("%5d", dp[i][j]);}printf("\n");}return 0;  
}

在这里插入图片描述
在这里插入图片描述

4、题目链接

Fibonacci数列
单词搜索
杨辉三角

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

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

相关文章

【CUDA】 矩阵乘向量 matVecMul

Matrix - Vector Multiplication 矩阵-向量乘法是线性代数中的基本操作。它用于将一个矩阵与一个向量相乘。乘法的结果是与输入向量大小相同的向量。 矩阵和向量的乘法如图1所示。 图1 基础kernel与共享内存kernel 执行矩阵-向量乘法的基础kernel是使用单个线程执行输出向量…

【SOLID原则前端中的应用】开闭原则(Open/Closed Principle)- vue3示例

开闭原则&#xff08;Open/Closed Principle&#xff09;在Vue 3中的应用 开闭原则&#xff08;Open/Closed Principle&#xff0c;OCP&#xff09;规定&#xff0c;软件实体&#xff08;类、模块、函数等&#xff09;应该对扩展开放&#xff0c;对修改关闭。 也就是说&#xf…

大型网站软件系统架构演进过程

在我们的生活中,通常会使用大型网站系统,比如购物网站淘宝,京东,阿里1688;大型搜索引擎网站百度,社交类的如腾讯旗下的微信,QQ及新浪旗下的微博等,他们通常都有一下特点: 高并发、大流量&#xff1a;这些系统必须能够处理成千上万甚至数百万的并发用户请求&#xff0c;以及持续…

Dubbo内部通信流程

我当时在学习的过程中搭建过demo&#xff0c;具体流程就是&#xff0c;我先定义了一个api接口模块&#xff0c;还定义一个服务提供者模块&#xff0c;然后服务提供方实现该接口&#xff0c;定义该方法具体的实现impl类&#xff0c;服务提供方启动时&#xff0c;将要暴露的服务和…

在线快速制作二维码的技巧,支持生成多种内容二维码

现在用二维码来分享内容是很多场景下会使用的一种方式&#xff0c;常见的展示内容有图片、文件、文本、音频、视频等&#xff0c;都可以生成二维码之后。通过手机扫码来查看内容&#xff0c;有利于内容的快速传播&#xff0c;并且用户获取信息也更加的方便。 下面来教大家使用…

Web应用防火墙用在哪些场景?

WAF是Web Application Firewall的缩写&#xff0c;翻译为“Web应用防火墙”是一种网络安全设备或服务&#xff0c;用于保护Web应用程序免受各种网络攻击和漏洞的影响。 WAF特别设计用于识别和阻止特定于Web应用程序的攻击&#xff0c;例如SQL注入、跨站脚本(XSS)、跨站请求伪造…

力扣习题--哈沙德数

一、前言 本系列主要讲解和分析力扣习题&#xff0c;所以的习题均来自于力扣官网题库 - 力扣 (LeetCode) 全球极客挚爱的技术成长平台 二、哈沙德数 1. 哈沙德数 如果一个整数能够被其各个数位上的数字之和整除&#xff0c;则称之为 哈沙德数&#xff08;Harshad number&…

CTF常用sql注入(二)报错注入(普通以及双查询)

0x05 报错注入 适用于页面无正常回显&#xff0c;但是有报错&#xff0c;那么就可以使用报错注入 基础函数 floor() 向下取整函数 返回小于或等于传入参数的最大整数。换句话说&#xff0c;它将数字向下取整到最接近的整数值。 示例&#xff1a; floor(3.7) 返回 3 floor(-2…

5.基于SpringBoot的SSMP整合案例-数据层开发

目录 1.新建项目 2.实体类开发&#xff1a; 2.1在pom.xml中增加Lombok坐标&#xff1a; 2.2添加Book实体类 3.数据层开发&#xff1a; 3.1 配置MyBatisPlus与Druid 3.2创建数据层接口 3.3写测试类 3.4点击运行&#xff1a; 4.数据层快速开发&#xff1a; 4.1配置MyB…

C++视觉开发 四.手势识别

本章记录传统手势识别&#xff0c;在表示0-5六个数值时的识别问题。例如识别剪刀石头布&#xff0c;手势&#xff0c;以及其表示的动作。在识别时将手势中的凹陷区域称为凸缺陷&#xff0c;其个数作为识别的重要依据。 需要注意&#xff0c;在凸缺陷个数为0时&#xff0c;无法…

S272钡铼技术4G无线RTU支持多路DIN输入和模拟量转换至4G网络

钡铼第四代RTU S272是一款先进的工业级4G远程遥测终端&#xff0c;为各种远程工业数据采集和控制系统提供了高效解决方案。结合了现代通信技术和多功能的输入输出接口&#xff0c;S272不仅支持多路数字量和模拟量输入&#xff0c;还具备灵活的扩展性和强大的控制功能&#xff0…

WEB攻防-XSS跨站反射型存储型DOM型标签闭合输入输出JS代码解析

文章目录 XSS跨站-输入输出-原理&分类&闭合XSS跨站-分类测试-反射&存储&DOM反射型XSS存储型XSSDOM-base型XSS XSS跨站-输入输出-原理&分类&闭合 漏洞原理&#xff1a;接受输入数据&#xff0c;输出显示数据后解析执行 基础类型&#xff1a;反射(非持续…

典型案例 | 基于全数字实时仿真的嵌入式DevOps解决方案

为丰富浙江省信息技术应用创新&#xff08;以下简称“信创”&#xff09;产业生态&#xff0c;在全社会各领域形成示范效应&#xff0c;浙江省经信厅联合省密码管理局开展2023年浙江省深化信创典型案例评选工作。 经过征集申报、专家评选、名单公示等程序&#xff0c;确定36个…

实现前端项目自动构建和部署(Gitee Go)

前言 相信所有的前端开发者都希望将自己的代码部署在服务器上让所有人都能访问到&#xff0c;但是却不知道如何进行部署。其实要是实现代码上线非常简单&#xff0c;我们只需要将build之后的代码上传到服务器&#xff0c;然后通过Nginx起一个服务指向我们build后的代码就可以了…

Cocos 7.2~7.4

这几天没更新CSDN&#xff0c;跑去玩Cocos了。自从知道我的粉丝百分之十之八九都是假人&#xff0c;更新确实没什么动力了。主要还是把这边当成一个日记本吧。 选择cocos的原因也很简单。会点js&#xff0c;技术栈比较接近&#xff0c;上手估计也快。简单记录下这几天的内容 主…

@amap/amap-jsapi-loader 实现高德地图中添加多边围栏,并可编辑,编辑后获得围栏各个点的经纬度

先上一张效果图 看看是不是大家想要的效果&#xff5e; ❤️ 希望其中的小点能帮助大家&#xff0c;主要看怎么绘制在地图上的代码即可 1.第一步要加入项目package.json中或者直接yarn install它都可以 想必大家应该都会 "amap/amap-jsapi-loader": "0.0.7&qu…

C语言作业笔记

1. 要找俩个数使其相加等于一个数&#xff0c;那么俩个数从头尾出发&#xff0c;先动一边&#xff0c;假设是尾先动&#xff0c;一开始俩个数相加大于sum&#xff08;小于的话就动头&#xff09;&#xff0c;那么总有一时刻俩数相加小于sum&#xff0c;则就在那一刻停下来&…

关于5G和卫星

手机&#xff0c;已经串联起了我们生活中的一切环节。我们随时随地拿出手机&#xff0c;都能畅快地上网。 这一切是如此地理所当然&#xff0c;以至于我们甚至想不到这样不可思议的问题&#xff1a; 移动通信网络真的无处不在吗&#xff1f; 我们都知道&#xff0c;地球虽叫…

毕业论文初稿写作方法与过程

毕业论文初稿写作方法与过程 毕业论文是大学生在学业结束前必须完成的一项重要任务&#xff0c;它不仅是对学生所学知识的综合运用&#xff0c;也是对学生研究能力和写作能力的检验。写好毕业论文初稿是完成高质量毕业论文的关键一步。下面将具体阐述毕业论文初稿的写作方法和过…

Redis 7.x 系列【18】事务

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 本系列Redis 版本 7.2.5 源码地址&#xff1a;https://gitee.com/pearl-organization/study-redis-demo 文章目录 1. 概述2. 命令2.1 MULTI2.2 EXEC2.3 DISCARD2.4 WATCH2.5 UNWATCH 3. 事务中的错误4.…