【刷题汇总--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;将要暴露的服务和…

运维行业的全新视界:一体化监控解决方案

在当今的IT环境中&#xff0c;运维团队面临着前所未有的挑战。随着技术的快速发展&#xff0c;企业需要更加高效、智能的监控工具来确保IT基础设施的稳定运行。本文旨在为运维团队提供一个全面的、集成多种功能的监控解决方案参考。 一、总体架构与要求 首先&#xff0c;一个理…

Python中的模块和包定义以及如何在Python中导入和使用它们

在Python中&#xff0c;模块&#xff08;Module&#xff09;和包&#xff08;Package&#xff09;是组织代码、重用代码的基本单位&#xff0c;它们让Python的编程更加模块化&#xff0c;易于管理和维护。 模块&#xff08;Module&#xff09; 模块是一个包含Python定义和声明…

金融科技的移动时代:探索APP与SaaS系统的结合之道

金融科技&#xff08;FinTech&#xff09;的革新正在重塑金融服务行业的未来。移动应用&#xff08;APP&#xff09;与软件即服务&#xff08;SaaS&#xff09;系统的结合&#xff0c;为金融行业带来了前所未有的灵活性和可扩展性。 一、金融科技的发展趋势 金融科技通过技术…

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

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

ubuntu rc.local开机自启动

https://blog.csdn.net/qq_48974566/article/details/137212295

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…

流式数据库 RisingWave「Demo」:直播指标实时分析

直播因其能与观众进行实时互动的独特优势&#xff0c;成为目前最为流行的娱乐形式之一。想要优化直播效果&#xff0c;有许多指标需要跟踪。最常见的指标比如&#xff1a;人流量、评论数量、直播卡顿时长等等。 本教程将分享如何使用 RisingWave 监控直播流量指标。我们为本教…

python访问mongoDB

pip install pymongo1.建立连接 &#xff08;1&#xff09;模块引用 import pymongoClientMongoClient(host10.90.9.101,port27017)(2)访问数据库 dbclient.myDBdbconn.get_database("myDB")2.集合操作 &#xff08;1&#xff09;插入文档 colldb.get_collection(…

docker-compose version is obsolete

如果更新了docker或者docker-desktop 启动时候发现有 version is obsolete警告 删除yml第一行的version字段 上社区原文 Technically you can still define it… But you will get the warning you observed, and it won’t be used, as docker compose v2 (the cli plugin…

关于TaOTUB1的信息总结

关于TaOTUB1的信息总结 文献标题: Reducing expression of TaOTUB1s decreases tiller number in wheat 核心内容: 背景和目的: 小麦的分蘖数量是影响产量的重要农艺性状。OTUB1在水稻中被发现能够调控分蘖数量&#xff0c;而在小麦中的功能尚不明确。本研究旨在通过鉴定和分…

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

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

细说QT程序高分屏适配

文章目录 高分屏适配适配屏幕缩放禁用屏幕缩放开启系统配置属性获取当前屏幕信息在Qt中实现高分辨率屏幕的适配,主要涉及对界面元素、字体大小和布局进行优化,以保证应用程序在不同分辨率和设备像素比率(DPI)的显示屏上均能正确显示。下面是一些关键步骤和技巧,用于在Qt应用…

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

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