选择题
题目选自牛客网
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数组的步骤如下:
- 初始化next[0] = 0,因为索引0处没有前缀可以匹配。
- 对于每个索引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,加油。