百度笔试—9.13研发B卷(1:ac,2:ac,3:91%)
1. 统计baidu型字符串(AC)
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String s = scanner.next();
int n = s.length();
// 标记26个字母的是否是元音
// 1:元音
// 0:辅音
int[] yy = new int[26];
yy['a' - 'a'] = 1;
yy['o' - 'a'] = 1;
yy['e' - 'a'] = 1;
yy['i' - 'a'] = 1;
yy['u' - 'a'] = 1;
// 标记字符串中的字符是否是元音
int[] a = new int[n];
for (int i = 0; i < n; ++i) {
a[i] = yy[s.charAt(i) - 'a'];
}
int ans = 0;
for (int i = 0; i < n - 4; ++i) {
// 用集合统计5个字符是否相同
// 如果集合大小为5,则互不相同
Set<Character> set = new HashSet<>();
set.add(s.charAt(i));
set.add(s.charAt(i + 1));
set.add(s.charAt(i + 2));
set.add(s.charAt(i + 3));
set.add(s.charAt(i + 4));
if (set.size() == 5 && a[i] == 0 && a[i + 3] == 0
&& a[i + 1] == 1 && a[i + 2] == 1 && a[i + 4] == 1) {
++ans;
}
}
System.out.println(ans);
}
} 2. 打怪(AC)
有n个怪物排成一排,第i个怪物的血量为ai。有两个技能可以打怪:
- 1.强力攻击,消耗1mp,对一只怪物造成1点伤害。
- 2.踏前斩,消耗5mp,对当前怪物造成1的伤害,同时剑气将波及后两个怪物,对下一个怪物造成
2点伤害,对下下个怪物造成3点伤害。
如果一个怪物受伤后血量小于等于0,则怪物死亡。死亡后怪物的尸体依然占据一个位置,会被踏前斩的剑气打到。
问击杀全部怪物至少需要花费多少mp?
倒着处理
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int[] a = new int[n];
for (int i = 0; i < n; ++i) {
a[i] = scanner.nextInt();
}
long ans = 0; // 这里必须用long,会超int
for (int i = n - 1; i >= 2; --i) {
int n1 = a[i] / 3;
int n2 = a[i - 1] / 2;
int n3 = a[i - 2];
int mn = Math.min(n1, Math.min(n2, n3));
ans += mn * 5;
a[i] -= mn * 3;
a[i - 1] -= mn * 2;
a[i - 2] -= mn;
ans += a[i];
}
ans += a[0] + a[1];
System.out.println(ans);
}
} 3. for循环的嵌套层数(90.91%)
一段java代码,判断其中最多有多少层for循环嵌套。
保证代码合法,且不含注释。循环语句只有for,条件语句只有if,循环语句和条件语句保证包含大括号用来控制范围。
代码中只有一个类和一个主函数。
栈。
只差一个样例没过,求大佬指教。
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
StringBuilder str = new StringBuilder("");
while (scanner.hasNextLine()) {
String input = scanner.nextLine();
str.append(input); // 将代码合并成一个长字符串
}
String s = str.toString();
Stack<String> stack = new Stack<>();
int ans = 0;
int cur = 0; // 当前嵌套层数
int n = s.length();
int i = 0;
while (i < n) {
// for 入栈,并且搜索到for后的'{'
if (s.charAt(i) == 'f' && s.charAt(i + 1) == 'o' && s.charAt(i + 2) == 'r') {
stack.push("for");
++cur;
ans = Math.max(ans, cur);
while (i < n - 2 && s.charAt(i) != '{') {
++i;
}
++i;
} else if (s.charAt(i) == 'i' && s.charAt(i + 1) == 'f') { // if ,入栈
stack.push("if");
while (i < n - 2 && s.charAt(i) != '{') {
++i;
}
++i;
} else if (s.charAt(i) == '}') {
// '}'是if的,直接出栈
if (!stack.isEmpty() && stack.peek().equals("if")) {
stack.pop();
} else if (!stack.isEmpty()) { // '}'是for的,嵌套层数减一
stack.pop();
--cur;
}
++i;
} else {
++i;
}
}
System.out.println(ans);
}
} #百度笔试##百度#