每日一练习,java

选择题

题目选自牛客网
1.下列哪种备份方式能基于上次任意一种备份,将上次备份后发生变化的数据进行备份,并将备份后的数据进行标记()
A按需备份
B完全备份
C增量备份
D差异备份

c
增量备份是一种备份策略,它基于上一次备份(无论是完全备份还是增量备份),只备份自上次备份以来发生变化的数据。增量备份通常会对备份的数据进行标记,以便于识别哪些数据是新备份的。这种备份方式可以有效地节省存储空间和备份时间,因为它只备份变化的部分。

2.在 E-R 图中,下面哪个符号用于表示实体?
A菱形
B矩形
C圆形
D三角形

正确答案:B 在 E-R
图中,矩形符号用于表示实体,表示一个具有属性和标识符的对象。菱形符号用于表示关系,圆形符号用于表示属性,三角形符号用于表示继承关系。

3.已知串S=‘bccabcaac’,采用KMP算法进行模式匹配,则得到的next数组值为()
A.011112311
B.021221121
C.011211111
D.011121112
正确答案:A

KMP算法中的next数组用于在模式匹配过程中,当发现当前字符不匹配时,能够快速跳过已经匹配的部分,继续进行匹配。next数组的构建基于模式字符串本身,对于给定的字符串’bccabcaac’,我们可以逐步构建next数组。

构建next数组的步骤如下:

  1. 初始化next[0] = 0,因为索引0处没有前缀可以匹配。
  2. 对于每个索引i,计算next[i]的值,它是最大的整数k,使得1 <= k < i,并且模式字符串从索引1到k的子串能与从索引i到i-k的子串匹配。

根据这个规则,我们可以逐步计算出’bccabcaac’的next数组:

  • next[0] = 0(无前缀匹配)
  • next[1] = 0('b’无前缀匹配)
  • next[2] = 0('bc’无前缀匹配)
  • next[3] = 1('bca’与’bca’匹配,k=1)
  • next[4] = 1('bcab’与’bca’匹配,k=1)
  • next[5] = 2('bcaba’与’bca’匹配,k=2)
  • next[6] = 3('bcacaa’与’bcab’匹配,k=3)
  • next[7] = 1('bccabca’与’bca’匹配,k=1)
  • next[8] = 1('bccabcaa’与’bca’匹配,k=1)

因此,next数组为[0, 0, 0, 1, 1, 2, 3, 1, 1],对应选项A。
在这里插入图片描述

4.下列关于 Java 中泛型(Generics)的说法正确的是()
A.泛型可以在编译时检查类型安全性,避免运行时出现类型转换异常
B.泛型可以应用于类、接口和方法,但不能用于数组
C.泛型中的类型参数可以是任何类或接口类型,甚至包括基本数据类型
D.泛型中的类型参数只能是对象类型,不能是基本数据类型
正确答案:AC

5.下面关于 Java 中反射机制的说法正确的是()
A.反射机制可以在程序运行时获取类的信息
B.反射机制可以动态地创建对象、调用方法和访问属性
C.反射机制能够提高程序的性能和安全性
D.反射机制只能用于访问 public 访问控制修饰符修饰的成员
正确答案:AB

C. 反射机制能够提高程序的性能和安全性。

这个说法是错误的。反射通常不会提高性能,因为它增加了运行时的类型检查和动态调用的开销。同时,由于反射可以绕过访问控制,如果使用不当,可能会降低安全性。
D. 反射机制只能用于访问 public 访问控制修饰符修饰的成员。

这个说法也是错误的。反射可以访问所有成员,包括 private、protected 以及 public 的字段和方法,尽管访问非
public 成员可能会抛出安全异常,需要适当的权限。
在这里插入图片描述

编程

小红有一颗树,每个结点有一个权值,初始时每个节点都是白色。小红每次操作可以选择两个相邻的结点,如果它们都是白色且权值的和是质数,小红就可以选择其中一个节点染红。

小红想知道最多可以染红多少个节点?

示例1 输入
3
1 2 3
1 2
1 3
输出 1
说明
节点1和节点2权值和为3,是质数,所以小红可以染红节点1或节点2,此时无法再染红其他节点。
public static void main(String[] args) {
final long MOD = (long) (1e9 + 7);
final int MAXN = (int) (2e5 + 10);

// 欧拉筛
isNotPrime = new boolean[MAXN];
List<Integer> primes = new ArrayList<>();

for(int i = 2; i < MAXN; i++){
    if(!isNotPrime[i])
        primes.add(i);
    for(int prime: primes){
        if(i * prime >= MAXN)
            break;
        isNotPrime[i * prime] = true;

        if(i % prime == 0)
            break;
    }
}

Scanner scanner = new Scanner(System.in);
int n  = scanner.nextInt();

value = new int[n + 1];
next = new List[n + 1];

//保存节点值
for(int i = 1; i <= n; i++) {
    value[i] = scanner.nextInt();
    next[i] = new ArrayList<>();
}
//建树
for(int i = 1; i < n; i++) {
    int x = scanner.nextInt();
    int y = scanner.nextInt();
    next[x].add(y);
    next[y].add(x);
}

// 把1看作根节点
dfs(1, -1);
System.out.println(res);

}

private static void dfs(int cur, int pre){
for(int nxt: next[cur]){
if(nxt == pre) // pre为父节点 防止反走
continue;
dfs(nxt, cur);

    int check = value[cur] + value[nxt];
    //能染就染 反正染的是儿子节点 不关父节点的事
    if(!isNotPrime[check]){
        res++;
    }
} }

分析

定义数据结构:使用数组来存储每个节点的值和邻接表。
读取输入:读取节点数量 n,每个节点的权值 a[i],以及边的信息来构建邻接表。
质数判断:实现一个函数来判断两个数的和是否为质数。
深度优先搜索:从每个未访问的节点开始进行DFS,尝试染红节点。
回溯:在DFS过程中,使用一个数组来记录当前节点的选择状态,以便回溯。

总结

离1000粉丝还差90,加油。

  • 20
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

布说在见

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值