有的同学问我:哥,我假期一点没学,现在还有没有救?
我说:有,我这里有最后一个月的免费冲刺班,17节集锦,让你轻松实现最后一个月弯道超车!
我会根据讲解去年蓝桥杯的真题和我之前练习的经典题目,以此来拓展知识点,为大家讲解算法知识,实现小白也能听懂拿分。(本课程针对冲省赛的选手)
一、课前准备:
推荐刷题网站:
1.蓝桥杯官网题库 题库 - 蓝桥云课 (这两个网址建议收藏,之后讲课用得上)
2.acwing网站 AcWing
大赛制定编译器: Dev-C++
具体下载方式可参考 DevC++下载安装和使用_哔哩哔哩_bilibili(具体方法很简单,无脑跟着操作就好,up主讲的很清楚,7.8分钟就能下好)
结合我在b站的课来学习:第一节课_哔哩哔哩_bilibili
二、(正课开始)第一讲:做题方法
1.首先,将做算法题分成四个步骤
第一步:读懂题意,用人脑的方法将题目模拟做出来(考验思维)
第二步:将第一步的方式用计算机语言(C/C++/Java/Python)表示写出来 (考验语法基础)
第三步:用数据结构或算法将之前的方法进行优化 (考验数据结构与算法知识)
第四步:调试与修改
(看看你自己做题的时候总是卡在哪一步?)
2.我们拿蓝桥杯题库里的一道题来举例
第一步,首先要仔细读题,读懂题目才是做题的基础。可知题目就是将段字符压缩成字符和数字的样子,如果我们自己拿笔做会怎么做?(大家先自己看着题目想一想,可以拿笔自己写几串字母,自己做做看)
大概率就是从前往后看,如果没有相连的相同字符就输出NO,如果有就把连续的字符都找出来,如果有一样的就合直到遇到不一样的字符,如果只有一个字母就只写字母
第二步,用翻译成对应的编程语言。(大家自己看看要如何做,字符要用什么数据结构存,数字要怎么存,如何使用,如何输入输出)
以C/C++为例,分享一下我的做题思路:显然,这道题中的字符串要用string类型或者char[]来存,输出的数字用int型定义。根据第一步的从前往后看,要从头开始用for循环开始遍历,for循环的终止条件用strlen()或者.lenth()找长度。如果没有相连的相同字符就输出NO。之后把连续的字符都找出来,我们可以一个一个判断前一个字符和后一个字符是否相等,如果相等,就将数字加一,如果不一样就输出字符和数字,如果数字为1就只输出字母。
第三步,用数据结构和算法进行优化,对于冲省赛队伍的小白来说,完成前两步就已经够了,这一步如果要完成,要投入大量精力来学习,如果有兴趣,本博主推荐acwing上的算法基础课。(纯推荐,不是广子)本题也就不需要来进行优化了,因为字符串长度只有最多只有500,我们的时间复杂度是O(N)(关于时间复杂度和优化我们下一节讲),1s完成绰绰有余。
第四步,俗称debug,这步纯靠各位同学平时的debug积累了,bug见多了,自然也就会改了。
代码如下:
#include <iostream>
#include <cstring>
using namespace std;
const int N = 510;
int main() {
char a[N];
cin >> a;
bool st = false; //用来判断是否有相同的字符,来看是否输出NO
int cnt = 1; //用来看有几个相同的字母
for(int i = 1; i < strlen(a); i ++ ){
if(a[i] == a[i - 1]) st = true; //如果有相同的字符,将st变为true
}
if(st){ //如果st为真,即有相同字符
for(int i = 1; i <= strlen(a); i ++ ){
if(a[i] == a[i - 1]) cnt ++ ; //如果前一个和后一个字母一样,cnt++
else{
if(cnt == 1) cout << a[i - 1]; //前后字母不一样,且cnt为1,只输出字符
else{
cout << a[i - 1] << cnt; //输出字母和数字
cnt = 1; //还原cnt
}
}
}
}
else printf("NO"); //没有相同字符,返回NO
return 0;
}
Java和Python基本也都是一样的
如果同学们的语法基础没有很牢固,不太熟练,建议课下将数组和字符串练到可以熟练使用,其他的暂时不做过多要求,如果会的话自然更好。
听懂了的同学留一个作业762. 字符串匹配 - AcWing题库