20220913百度2023秋招研发B卷题解
T1
小红拿到了一个字符串,她想知道有多少个"baidu"型子串? 所谓"baidu“型字符串,指第1个、第4个字母是辅音,第2、3、5个字符是元音,且每个字母都不相同的字符串。 例如,"taigu"、"huida"、"paobu"、"baoli"等都是"baidu"型字符串。 我们定义元音字母仅有'a、'e'、'i'、'o'、'u'这五种,其余字母均为辅音字母。 输入一个字符串,长度<=2e5 输出"baidu"型子串的数量 input: baiduxiaojiabankanjiaran output: 2 "baidu"和"duoxi"合法。其中"jiaba"和"jiara"不合法,因为a出现了2次。
滑动窗口,维护一下窗口内字母特征以及字母出现次数即可。
import string s = input() if len(s) <= 4: print(0) exit(0) else: cor = {v: i for i, v in enumerate(string.ascii_lowercase)} y = set(list('aeiou')) nums = [0 if i in y else 1 for i in s] ans = 0 diff = 0 count = [0] * 26 cnt = 0 for i in range(4): cnt = cnt * 10 + nums[i] count[cor[s[i]]] += 1 if count[cor[s[i]]] > 1: diff += 1 for i, v in enumerate(s[4:], start=4): cnt = cnt * 10 + nums[i] count[cor[v]] += 1 if count[cor[v]] == 2: diff += 1 if cnt == 10010 and not diff: ans += 1 cnt -= nums[i - 4] * 10000 count[cor[s[i - 4]]] -= 1 if count[cor[s[i - 4]]] == 1: diff -= 1 print(ans)
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
贪心即可,因为5hp是可以消耗1+2+3=6滴血的。所以优先使用技能,剩下的普通攻击A掉。
贪心的时候注意从后往前遍历,这样可以通过100%,从前往后遍历只能通过0%。提供case:[1, 9, 8, 9, 8]:
- 从前往后贪:[1,4,8,7,6]-->[0,2,5,7,6]-->[0,0,1,1,6]
- 从后往前贪:[1,4,8,7,6]-->[1,4,6,3,0]-->[1,3,4,0,0]-->[0,1,1,0,0]
n = int(input()) a = list(map(int, input().split())) ans = 0 i = 0 for i in range(n - 3, -1, -1): if a[i] >= 1 and a[i + 1] >= 2 and a[i + 2] >= 3: c = min(a[i], a[i + 1] // 2, a[i + 2] // 3) a[i] -= c a[i + 1] -= c * 2 a[i + 2] -= c * 3 ans += c * 5 print(ans + sum(a))
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
模拟题,注意多行输入。维护一个栈维护遇到的大括号和过程值cnt=0,因为题目说了for循环必然使用大括号包裹,那么只需要判断栈入的大括号前面是不是for的大括号即可,如果是就cnt+1,否则就不管。每次遇到右括号就出栈,出栈的时候判断是不是for循环后的括号,如果是就cnt-1,否则就不管。遍历过程中最大的cnt就是结果。
注意Python多行输入。
import sys lines = list(sys.stdin.readlines()) a = ''.join(lines) stack = [] n = len(a) ans = 0 cnt = 0 pf = 0 # 前一个是不是for i = 0 while i < n - 4: if a[i] == '{': stack.append(pf) cnt += pf pf = 0 i += 1 elif a[i] == 'f' and a[i + 1] == 'o' and a[i + 2] == 'r': pf = 1 i += 3 elif a[i] == '}': cnt -= stack.pop() i += 1 else: i += 1 ans = max(ans, cnt) print(ans)#百度##百度笔试##笔试##百度23秋招笔试编程题有点儿简单啊#