浅浅记录一次百度伪笔试「2022-09-13」

T1

题目描述

小红拿到了一个字符串,她想知道有多少个"baidu"型子串? 所谓"baidu“型字符串,指第1个、第4个字母是辅音,第2、3、5个字符是元音,且每个字母都不相同的字符串。 例如,"taigu"、"huida"、"paobu"、"baoli"等都是"baidu"型字符串。 我们定义元音字母仅有'a、'e'、'i'、'o'、'u'这五种,其余字母均为辅音字母。

输入一个字符串,长度<=2e5 输出"baidu"型子串的数量

input: baiduxiaojiabankanjiaran

output: 1

"baidu"和"duoxi"合法。其中"jiaba"和"jiara"不合法,因为a出现了2次。

分析

滑动窗口模版题,详情可见 滑动窗口

代码

T2

题目描述

有n个怪物排成一排,第i个怪物的血量为ai。小红有两个技能可以打怪:

  1. 强力攻击,消耗1mp,对一只怪物造成1点伤害。
  2. 踏前斩,消耗5mp,对当前怪物造成1的伤害,同时剑气将波及后两个怪物,对下一个怪物造成2点伤害,对下下个怪物造成3点伤害。

如果一个怪物受伤后血量小于等于0,则怪物死亡。死亡后怪物的尸体依然占据一个位置,会被踏前斩的剑气打到。 小红想知道,击杀全部怪物至少需要花费多少mp?

输入一个n和n个数字作为所有怪物血量 输出最小使用的mp

input: 5 1 2 4 2 3

output: 10

分析

这个题目虽然不是很难,但是有坑 😭😭

当使用「强力攻击」,1mp 对应 1点伤害

当使用「踏前斩」,最好的效果是 5mp 对应 6 点伤害

所以我们的策略就是能使用「踏前斩」,就使用它,它会让我们的攻击收益最高

一开始,我是从左向右贪心,但是貌似有点问题,对于样例「1 2 5 10 15」,从左向右贪心的结果是 30,自己可以手动模拟一波,但如果我们从右向左贪心,结果是 28

我看大家说后台的数据都是从右向左贪心才能得到最优解,如果把上述样例反转「15 10 5 2 1」,那就要从左向右贪心才可以得到最优解

所以这个题目最严谨的做法就是分别「从左向右贪心」和「从右向左贪心」,然后取最小值!

代码

T3

题目描述

小红拿到了一段java代码,请你判断其中最多有多少层for循环嵌套。 保证代码合法,且不含注释。循环语句只有for,条件语句只有if,循环语句和条件语句保证包含大括号用来控制范围。 代码中只有一个类和一个主函数。

多行输入 输出最大嵌套数

input: import java.util.*;

public class Main{ public static void main(String[] args){ Scanner in = new Scanner(System.in); int a = 0 , b = 0; int n = in.nextInt(); for (int i = 0; i < n; i++) { if ( a < b ) { a += b / 2; } for (int j = 0; j < n; j++) { b++; a += b; } for (int j = 1; j < n; j *= 2) { b--; } } System.out.println(a); } }

output: 2

代码