蓝桥杯历年省赛真题
点击链接免费加入题单
杂项
结构体排序
结构体是 自定义类型 ,它就像一个 能装不同数据类型 的“包裹”。当你声明一个结构体后,需要赋予这个结构体一个名字(即 结构体名 )。而 定义具体变量时,也可以定义结构体数组 。这相当于告诉计算机,你一口气定义了许多“包裹”,每一个“包裹”里面都可以装入许多不同或相同数据类型的变量。
1.结构体的声明
使用结构体前,需要先声明一个结构体类型,再进行定义和使用。结构体类型的声明格式为:
struct 结构体类型名{ //其中,sruct是关键字,在c++中表示结构体
数据类型 成员变量1; //多个成员变量可以具有不同的数据类型
数据类型 成员变量2;
......
};
声明之后,就可以定义结构体变量了,格式如下:
结构体类型名 变量名;(struct 可省略)
例如
我们需要表示一个学生的信息,首先我们声明学生的结构体:
struct student{ //student表示结构体的类型名
string name;
char sex;
int age;
float height,score;
};
然后定义一个具体的学生:
student zhangsan;//声明一个student的结构体变量叫zhangsan
当然我们如果需要很多学生,可以声明为结构体数组:
student a[1001];//创建结构体数组a
//a数组中的每一个元素都是一个结构体类型student的变量
另外
为方便起见,我们一般直接在声明结构体的同时定义变量,格式如下:
struct 结构体类型名{ //其中,sruct是关键字,在c++中表示结构体
数据类型成员变量1; //多个成员变量可以具有不同的数据类型
数据类型成员变量2;
......
}结构体变量表;
比如:
struct student{
string name;
char sex;
int age;
float height,score;
}a[1001];
2.结构体的使用
(1)将结构体变量视为一个整体进行操作,例如:
swap(a[1], a[2]);
(2)使用符号“.”对结构体变量的成员进行操作,“.”的含义可以理解为中文的“的”,格式为:
结构体名.成员变量名
比如:
student a;//李四
cin >> a.name;//输入赋值李四的名字
a.age = 23;//直接赋值给李四的年龄为23
3.结构体的初始化
(1)集合形式,比如:
student a = {"tuotuo",'F',12,168,100};
(2)逐一赋值,比如:
student a;
cin >> a.name >> a.sex;
a.age = 12;
4.结构体中的sort()函数
现在给你一个结构体,现在有这样一个要求:按照年龄从小到大输出。
那我们就照结构体中成员变量age(也就是年龄)进行从小到大的排序,代码如下:
struct student {
string name;
int age;
float height;
}a[10];
bool cmp(student a, student b){
return a.age < b.age;
}
int main(){
...//输出
sort(a, a + n, cmp);//按照年龄从小到大排序
...//输出
}
数组标记与数组连续性
字符统计 (蓝桥杯Java 2022B组省赛 | 数组标记)
- 题目思路
数组标记是指用数组去存储问题中的输入数据或者中间数据,比如计数、判断有无,本质上是用空间换时间,最常见的好处就是降低代码的时间复杂度,不容易出现超时问题。同时这种标记法也可以用上我们之前的 map
。
本题只需要用数组去标记出现字符出现的次数即可,需要结合前面字符ASCII值的知识。
// 标记数组
int flag[N]; // flag[i] 用于标记状态或者计数
flag[i] = 1; // 数组标记状态,选择 / 不选择
flag[i]++; // 数组标记计数,记录i出现的次数
- 代码
#include<bits/stdc++.h>
using namespace std;
string s;
int b[26];
int main() {
cin >> s;
for (int i = 0; i < s.size(); i ++)
b[s[i] - 'A'] ++;
int maxx = 0;
for (int i = 0; i < 26; i ++)
maxx = max(maxx, b[i]);
for (int i = 0; i < 26; i ++)
if (b[i] == maxx) cout << char(i + 'A');
return 0;
}
单词分析(蓝桥杯Java2020B组省赛第二场 | 数组标记)
数组连续性
// 连续最长相同、最长上升或下降: 相邻两项比较,并讨论即可
int a[N], s = 0;
int ans = 0;
for(int i = 1; i <= n; i++) {
if(a[i] == a[i-1]) { // a[i] < a[i-1] 或 a[i] > a[i-1]
s++;
ans = max(ans, s);
} else {
s = 1;
}
}
cout << ans;
拓拓的字符串压缩
- 题目思路
先求出字符串长度,然后从下标 0 0 0 开始每次和后面一个字符比较
(1)如果和后面一个字符相等,计数的变量加1
(2)如果和后面一个字符不相等,输出字符以及计数的变量,并将计数的变量清空为1
最后需要在循环外,再输出最后一个字符以及计数变量。为什么呢?我们考虑一下 aabbccc
最后一个字符 c
是不是后面没有不同的字符,我们发现我们只会在字符串不相等的时候才输出,所以最后一个字符 c
和它出现的次数没有输出。
- 代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
string str;
cin >> str;
int n = str.size();
int c = 1;
for(int i = 0;i < n - 1;i++) {
if(str[i] == str[i + 1]) {//相等计数加1
c++;
}
else {
cout << str[i] << c;
c = 1;//清空为1不是0,因为这个字符出现了代表至少有1个
}
}
cout << str[n - 1] << c;//可能最后几个字符连续相等需要在循环外补充输出
return 0;
}