【蓝桥杯冲刺省一,省一看这些就够了-Java版本】蓝桥杯编程杂项

蓝桥杯历年省赛真题

点击链接免费加入题单

杂项

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的类。该类具有两个成员变量nameage,以及一个构造方法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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值