百度笔试—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);
    }
}
#百度笔试##百度#
全部评论
大佬求问为什么打怪那题需要倒着处理,或者说有什么例子是反向遍历能过正向遍历过不了的?
点赞 回复 分享
发布于 2022-09-14 07:51 广东
楼主收到面试邀约了么
点赞 回复 分享
发布于 2022-09-16 12:20 广东

相关推荐

6 25 评论
分享
牛客网
牛客企业服务