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

news2024/10/6 18:32:08

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.coloradmin.cn/o/1893594.html

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

相关文章

使用 pyecharts 渲染成图片程序报错: echarts is not defined问题处理

背景 之前写的使用 snapshot_selenium 来保存pyeacharts渲染成的网页截图&#xff0c;可以正常运行。程序搁置了半年&#xff0c;不知道动了电脑哪里&#xff0c;再次运行程序时&#xff0c;程序开始报错&#xff1a;JavascriptException: javascript error: echarts is not d…

EDUSRC-我与xx职院的爱恨情仇(教育漏洞挖掘)

一、人生中的第一个漏洞 2024.1月的时候&#xff0c;当时看朋友挖到了一个名校的漏洞&#xff0c;特别羡慕&#xff0c;我也想挖&#xff0c;但是当时什么都不会&#xff0c;就只好在网上搜edusrc挖掘思路、edusrc挖掘教程等等&#xff0c;边学边挖&#xff0c;边挖边学。 一开…

揭秘Stable Diffusion做AI绘图赚钱秘诀:从零开始月入过万

1. 概述 随着人工智能技术的飞速发展&#xff0c;AI绘图已经成为一个热门话题。AI绘图不仅在艺术创作中展现了巨大的潜力&#xff0c;还为个人和企业提供了多种赚钱的机会。本文将详细介绍几种通过AI绘图赚钱的方法&#xff0c;帮助你在这个新兴领域中找到适合自己的盈利途径。…

苹果公司的Wifi定位服务(WPS)存在被滥用的风险

安全博客 Krebs on Security 2024年5月21日发布博文&#xff0c;表示苹果公司的定位服务存在被滥用风险&#xff0c;通过 "窃取"WPS 数据库&#xff0c;可以定位部队行踪。 相关背景知识 手机定位固然主要依赖卫星定位&#xff0c;不过在城市地区&#xff0c;密集的…

为什么要卸载手机上面的抖音?

删除抖音等社交媒体应用可能出于多种原因&#xff0c;这里列举一些常见的考虑因素&#xff1a; 1. **时间管理**&#xff1a; 抖音和其他社交媒体平台可能会占用大量时间&#xff0c;影响个人的日常生活和工作学习效率。 这个对于自己而言是一个客观存在的事情&#xff1a; 2.…

恭喜!H医生一个月内荣获美国芝加哥大学访问学者邀请函

➡️【院校背景】 芝加哥大学&#xff08;英文&#xff1a;The University of Chicago&#xff0c;简称UChicago、“芝大”&#xff09;由石油大王约翰洛克菲勒于1890年创办&#xff0c;坐落于美国伊利诺伊州芝加哥市&#xff0c;一所私立研究型大学&#xff0c;属于全球大学校…

香橙派 AIpro 根据心情生成专属音乐

香橙派 AIpro 根据心情生成专属音乐 一、开机1.1 开发板开机1.2 远程连接到 OrangePi AIpro 二、开发环境搭建2.1 创建环境、代码部署文件夹2.2 安装 miniconda2.3 为 miniconda 更新国内源2.4 创建一个 python 3.9 版本的开发环境 三、基于MindNLP MusicGen生成自己的个性化音…

MWCSH 2024丨美格智能亮相上海世界移动通信大会,加速5G+AIoT应用进程

6月26日—28日全球通信领域最具规模和影响力的通信盛事—2024MWC上海世界移动通信大会在上海新国际博览中心隆重举行。MWC上海是亚洲连接生态系统的风向标&#xff0c;本届大会以“未来先行&#xff08;Future First&#xff09;”为主题&#xff0c;聚焦“超越5G”“人工智能经…

《vue3》reactivity API(vue3的$set呢?)

在Vue2中&#xff0c;修改某一些数据&#xff0c;视图是不能及时重新渲染的。 比如数组 <div> {{ myHobbies }} </div>data: () > ({myHobbies: [篮球, 羽毛球, 桌球] }); mounted () {this.myHobbies[1] sing; // 视图层并没有改变 }因此&#xff0c;Vue2就提…

UE插件与云渲染:10个提升效率的选择

Unreal Engine&#xff08;虚幻引擎&#xff09;的插件生态丰富多样&#xff0c;从提升视觉效果到优化工作流程&#xff0c;为开发者提供了无限扩展的可能。本文推荐10款备受欢迎的插件&#xff0c;助你激发创意&#xff0c;提升开发效率. 一、地牢建筑师&#xff1a;程序化关…

element-ui Tree之懒加载叶子节点强制设置父级半选效果

效果&#xff1a; 前言&#xff1a; 我们是先只展示一级的&#xff0c;二级的数据是通过点击之后通过服务器获取数据&#xff0c;并不是全量数据直接一起返回回来的。 问题&#xff1a; 当你设置了默认选中的子节点&#xff0c;但是由于刚进入页面此时tree中数据暂是没有这个…

每日一练:攻防世界:Hidden-Message

追踪UDP数据流&#xff0c;没有任何隐藏信息&#xff1a; WP&#xff1a; 观察流量包 每个流的唯一的区别就是UDP的源地址srcport的最后一位在变化 都提取出来就是二进制序列 用tshark提取一下 //使用tshark过滤出源端口&#xff0c;使用cut裁取端口的最后一位 tshark -r 8…

SSM学生资助管理系统-计算机毕业设计源码30825

目 录 摘 要 1 绪论 1.1 研究背景 1.2研究意义 1.3论文结构与章节安排 2 学生资助管理系统分析 2.1 可行性分析 2.1.1 技术可行性分析 2.1.2 经济可行性分析 2.1.3 法律可行性分析 2.2 系统功能分析 2.2.1 功能性分析 2.2.2 非功能性分析 2.3 系统用例分析 2.4 …

室内效果图渲染要多久?

效果图的渲染时间并非固定&#xff0c;一张效果图的渲染时间可能从几分钟到几小时不等&#xff0c;甚至对于非常复杂和高质量的渲染任务&#xff0c;可能需要几天的时间。影响效果图渲染时间的因素有很多&#xff0c;今天就给大家介绍一下。 电脑配置 一、电脑配置 CPU和GPU…

牛客小白月赛97 (个人题解)(待补完)

前言&#xff1a; 前天晚上写的一场牛客上比赛&#xff0c;虽然只写出了三道&#xff0c;但比起之前的成绩感觉自己明显有了一点进步了&#xff0c;继续努力吧&#xff0c; 正文&#xff1a; 链接&#xff1a;牛客小白月赛97_ACM/NOI/CSP/CCPC/ICPC算法编程高难度练习赛_牛客竞…

TCP粘包解决方法

一. 产生原因及解决方法 产生原因&#xff1a;TCP是面向连接、基于字节流的协议&#xff0c;其无边界标记。当服务端处理速度比不其接收速度时&#xff0c;就很容易产生粘包现象。 解决方法&#xff1a;目前主要有两种解决方法&#xff0c;一个是在内容中添加分割标识&#xf…

记录问题:解决vscode找不到Python自定义模块,报错No module named ‘xxx‘

1. 背景 我非要用vscode&#xff0c;不用pycharm&#xff0c;哼&#xff01; 2. 问题 由于 import xx 自定义的模块&#xff0c; python run 的时候会报错 No module named ‘xxx‘ 报错信息&#xff1a; Traceback (most recent call last):File "d:\work\sf_financ…

Pharmacy Management System v1.0 文件上传漏洞(CVE-2022-30887)

前言 CVE-2022-30887 是一个存在于 Pharmacy Management System v1.0 中的远程代码执行&#xff08;RCE&#xff09;漏洞。这个漏洞存在于 /php_action/editProductImage.php 组件中。攻击者可以通过上传一个精心制作的图像文件来执行任意代码。 漏洞详细信息 漏洞描述: Pha…

通过升级nginx完美修复nginx相关漏洞

目录 前言1 安全评估报告的漏洞信息1.1 nginx漏洞概况1.2 nginx漏洞详细信息1.3 安装的软件信息 2 问题分析3 Nginx从1.18版本升级到1.26版本的步骤与说明3.1 查看现有Nginx配置参数3.2 下载新版本Nginx3.3 配置新版本Nginx3.4 编译新版本Nginx3.5 备份旧版本Nginx的二进制文件…

java 基础之 反射技术_java 程序src阶段 class对象阶段 run阶段3个阶段

System.out.println(in); } publicClass[] aa1(String name, int[] password){ returnnew Class[]{String.class} ; } privatestatic void aa1(int num){ System.out.println(num“静态方法”); } public static void main(String[] args){ System.out.println(“main”…