蓝桥杯历年省赛真题
点击链接免费加入题单
杂项
Java中的类
在Java中,与C++中的结构体类似的概念是类(class)。类是Java中的一种重要的数据结构,用于表示对象的属性和行为。类可以看作是一种用户自定义的数据类型,可以包含各种类型的变量(成员变量)和方法(成员方法)。
以下是一个简单的示例,演示如何在Java中创建一个类并实例化对象:
// 定义一个名为Person的类
class Person {
// 成员变量
String name;
int age;
// 构造方法
public Person(String name, int age) {
this.name = name;
this.age = age;
}
// 成员方法
public void display() {
System.out.println("Name: " + name);
System.out.println("Age: " + age);
}
}
public class Main {
public static void main(String[] args) {
// 创建Person类的对象
Person person1 = new Person("John", 30);
Person person2 = new Person("Alice", 25);
// 调用对象的成员方法
System.out.println("Person 1:");
person1.display();
System.out.println("\nPerson 2:");
person2.display();
}
}
在上面的示例中,我们首先定义了一个名为Person
的类。该类具有两个成员变量name
和age
,以及一个构造方法Person()
用于初始化对象的成员变量。另外,类中还有一个成员方法display()
,用于显示对象的信息。然后,在Main
类中,我们创建了两个Person
对象,并通过调用对象的display()
方法来显示它们的信息。
阿里巴巴与金币
import java.util.Arrays;
import java.util.Scanner;
// 定义节点类
class Node {
double m; // 质量
double v; // 价值
double avg; // 单位质量的平均价值
}
public class Main {
// 自定义比较函数,用于排序
static class NodeComparator implements Comparator<Node> {
public int compare(Node x, Node y) {
return Double.compare(y.avg, x.avg); // 降序排序
}
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n, t;
n = scanner.nextInt();
t = scanner.nextInt();
Node[] a = new Node[110]; // 创建节点数组
// 读取输入数据并计算单位质量的平均价值
for (int i = 1; i <= n; i++) {
a[i] = new Node(); // 创建节点对象
a[i].m = scanner.nextDouble();
a[i].v = scanner.nextDouble();
a[i].avg = a[i].v / a[i].m;
}
// 对节点数组按单位质量的平均价值进行降序排序
Arrays.sort(a, 1, n + 1, new NodeComparator());
double sum = 0;
// 遍历节点数组,贪心选择物品
for (int i = 1; i <= n; i++) {
if (t >= a[i].m) {
sum += a[i].v;
t -= a[i].m;
} else {
sum += t * a[i].avg;
break;
}
}
// 输出结果,保留两位小数
System.out.printf("%.2f\n", sum);
}
}
数组标记与数组连续性
字符统计(蓝桥杯Java 2022B组省赛 | 数组标记)
- 题目思路
数组标记是指用数组去存储问题中的输入数据或者中间数据,比如计数、判断有无,本质上是用空间换时间,最常见的好处就是降低代码的时间复杂度,不容易出现超时问题。同时这种标记法也可以用上我们之前的 map
。
本题只需要用数组去标记出现字符出现的次数即可,需要结合前面字符ASCII值的知识。
- 代码
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String s = scanner.next(); // 读取输入的字符串
int[] b = new int[26]; // 创建一个长度为 26 的数组,用于存储每个字母出现的次数
// 统计每个字母出现的次数
for (int i = 0; i < s.length(); i++) {
char ch = s.charAt(i); // 获取字符串中的每个字符
int index = ch - 'A'; // 将字符转换为对应的数组下标
b[index]++; // 对应字母出现次数加一
}
int maxx = 0;
// 找到出现次数最多的字母
for (int i = 0; i < 26; i++) {
maxx = Math.max(maxx, b[i]); // 更新最大出现次数
}
// 输出出现次数最多的字母(可能有多个)
for (int i = 0; i < 26; i++) {
if (b[i] == maxx) {
System.out.print((char) (i + 'A')); // 将数组下标转换为字母并输出
}
}
}
}
单词分析(蓝桥杯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;
}