3.21晚 贝壳笔试编程题统计

第一次AK,果然还是小厂比较轻松

第一题

动态规划,`dp[i]`表示`[0,i]`能得到的最大分数


package beike.q1;

// 本题为考试单行多行输入输出规范示例,无需提交,不计分。
import java.util.Arrays;
import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        while (in.hasNextInt()) {// 注意,如果输入是多个测试用例,请通过while循环处理多个测试用例
            /*
                dp[i] 表示0..i能够得到的最大分数
                dp[i] = dp[j] + score(j..i) for j in 0..i
             */
            int n = in.nextInt();
            String s = in.next();

            int[] dp = new int[s.length()];
            Arrays.fill(dp, Integer.MIN_VALUE);
            dp[0] = -1;

            for (int i = 1 ; i < s.length() ; i++) {
                int score = dp[i-1] - 1;
                int[] freq = new int[26];
                for (int j = i ; j >= 0 ; j--) {
                    freq[s.charAt(j)-'a']++;
                    int sc = cal(freq);
                    if (j > 0) {
                        score = Math.max(sc+dp[j-1], score);
                    } else {
                        score = Math.max(sc, score);
                    }
                }
                dp[i] = score;
            }
            System.out.println(dp[s.length()-1]);
        }
    }

    private static int cal(int[] freq) {
        int score = 0;
        for (int i : freq) {
            if (i != 0) {
                if (i % 2 == 1) {
                    score --;
                } else {
                    score ++;
                }
            }
        }

        return score;
    }
}

第二题


直接算,缓存一下提高效率,你要想写还可以用前缀和,我直接循环竟然过了

package beike.q2;

// 本题为考试单行多行输入输出规范示例,无需提交,不计分。
import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int[] cache = new int[1000003];
        for (int i = 1 ; i < cache.length ; i++) {
            if (match(i)) {
                cache[i] = 1;
            } else {
                cache[i] = 2;
            }
        }

        while (in.hasNextInt()) {// 注意,如果输入是多个测试用例,请通过while循环处理多个测试用例
            int t = in.nextInt();
            while (t-- > 0) {
                int l = in.nextInt();
                int r = in.nextInt();
                int cnt = 0;
                for (int i = l ; i <= r ; i++) {
                    if (cache[i] == 1) cnt++;
                }
                System.out.println(cnt);
            }
        }
    }

    private static boolean match(int s) {
        int t = s;
        int ss = 0;
        while (t > 0) {
            ss += t % 10;
            t /= 10;
        }
        if (s % ss == 1) {
            return true;
        }
        return false;
    }
}

第三题


矩阵里面逐个匹配即可

package beike.q3;

// 本题为考试单行多行输入输出规范示例,无需提交,不计分。
import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        while (in.hasNextInt()) {// 注意,如果输入是多个测试用例,请通过while循环处理多个测试用例
            int n = in.nextInt();
            String s = in.next();
            int[][] matrix = new int[n][n];

            for (int i = 0 ; i < n ; i++) {
                String line = in.next();
                for (int j = 0 ; j < n ; j++) {
                    matrix[i][j] = line.charAt(j);
                }
            }

            System.out.println(match(matrix, n, s));

        }
    }

    private static int match(int[][] matrix, int n, String s) {
        int cnt = 0;
        for (int r = 0 ; r < n ; r++) {
            for (int c = 0 ; c < n ; c++) {
                if (matrix[r][c] == s.charAt(0)) {
                    // 开始四个方向匹配
                    // up
                    if (r-s.length()+1 >= 0) {
                        boolean m = true;
                        for (int j = 0 ; j < s.length() ; j++) {
                            if (matrix[r-j][c] != s.charAt(j)) {
                                m = false;
                                break;
                            }
                        }
                        if (m) cnt++;
                    }
                    if (s.length() == 1) continue;
                    // down
                    if (r+s.length()-1 < n) {
                        boolean m = true;
                        for (int j = 0 ; j < s.length() ; j++) {
                            if (matrix[r+j][c] != s.charAt(j)) {
                                m = false;
                                break;
                            }
                        }
                        if (m) cnt++;
                    }
                    // right
                    if (c+s.length()-1 < n) {
                        boolean m = true;
                        for (int j = 0 ; j < s.length() ; j++) {
                            if (matrix[r][c+j] != s.charAt(j)) {
                                m = false;
                                break;
                            }
                        }
                        if (m) cnt++;
                    }
                    // left
                    if (c-s.length()+1 > 0) {
                        boolean m = true;
                        for (int j = 0 ; j < s.length() ; j++) {
                            if (matrix[r][c-j] != s.charAt(j)) {
                                m = false;
                                break;
                            }
                        }
                        if (m) cnt++;
                    }
                }
            }
        }
        return cnt;
    }
}




#贝壳笔试##贝壳找房#
全部评论
求dl贴一份代码,让我学习学习🤣第一题(字符串分组)完全没有思路,第三题(查找字符串在矩阵中的次数)也不知道如何优化暴力
6 回复 分享
发布于 2022-03-21 20:19
我是垃圾  一个也没写出来  是不是凉了
4 回复 分享
发布于 2022-03-21 21:05
没有0的选项,我不是很认可😥 感觉会俩题,结果不知到细节哪错了
3 回复 分享
发布于 2022-03-21 21:04
楼主第一题真妙啊,我用DFS超时只A了18
2 回复 分享
发布于 2022-03-21 21:04
暴力,竟然能过。。我一直在找规律,好吧,我真傻
2 回复 分享
发布于 2022-03-21 21:07
第三题。。。测试案例都过了 结果是0%
1 回复 分享
发布于 2022-03-21 20:26
我是废物😂
1 回复 分享
发布于 2022-03-21 20:52
求第三题的代码
点赞 回复 分享
发布于 2022-03-21 20:25
求教第一题
点赞 回复 分享
发布于 2022-03-21 20:39
求第一第三😩
点赞 回复 分享
发布于 2022-03-21 20:40
怎么都在求第一第三。。求个第二
点赞 回复 分享
发布于 2022-03-21 20:42
第一题我想用线性查找树,但是合并的时候没有正确做出来。 第三题就横着扫,竖着扫,写两个函数,优化的话,横着扫保证起点到终点的长度大于目标字符串的长度
点赞 回复 分享
发布于 2022-03-21 20:47
求第一题思路
点赞 回复 分享
发布于 2022-03-21 20:57
第一题想到用动态规划的时候已经晚了只剩下10分钟了。。。用回溯调了半天 都是只过18.75。。。
点赞 回复 分享
发布于 2022-03-21 21:04
第二题和楼主思路一样,但是缓存用的hashset,只ac了40%,
点赞 回复 分享
发布于 2022-03-21 21:04
第一题回溯直接超内存了。。。
点赞 回复 分享
发布于 2022-03-21 21:07
看了下面评论,貌似是22春招和23暑期实习同一批考
点赞 回复 分享
发布于 2022-03-21 21:07
过多少才能有面试机会呀?呜呜呜,菜狗落泪
点赞 回复 分享
发布于 2022-03-21 21:08
***了,第一题用了前缀和求(i,j)之间的字母个数,然后超时了,过了80%
点赞 回复 分享
发布于 2022-03-21 21:09
快自闭了,一题都没解出来
点赞 回复 分享
发布于 2022-03-21 21:10

相关推荐

点赞 评论 收藏
分享
评论
13
30
分享
牛客网
牛客企业服务