奇安信笔试2021/8/7

第一部分

单选题:操作系统,网络,Linux,数据库,Java基础(Linux指令,操作系统的页啊不会)

第二部分

多选题:范围和第一部分一样,还是有不少不会,操作系统和Linux不会

第三部分

这两题的地址:两道笔试题目

很开心,他是核心代码模式,不用处理输入输出!!!

第一题:

给你一组人,height数组
从这个数组中找三个人,i,j,k这三个人的高度height[i],height[j],height[k]必须逆序或者顺序排列
这三个人可以是多个小组的一部分

输入:[1,5,3,2,4]
输出:3
我们可以组建:(1,3,4)( 1,2,4 )( 5,3,2)

我是暴力破解(这个代码也可以优化,我不知道怎么同时求正序和逆序的人的身高,就是能不能把process和process2的代码合并),想不出动态规划,希望有大佬能在评论区指出更好的思路!!!

/**
 * @author keboom
 * @date 2021/8/7
 */
public class Main1 {

    int res = 0;

    public int TeamNums (int[] height) {
        // write code here
        process(height,0,0,-1);
        process2(height, 0, 0, -1);
        return res;
    }
    // 寻找身高从小到大的人
    private void process(int[] height, int count, int index,int pre) {
        if (index == height.length) {
            return;
        }
        for (int i = index; i < height.length; i++) {
            if (count == 2 && height[i] > pre) {
                res++;
                continue;
            }
            if (pre == -1 || height[i] > pre) {
                process(height, count+1, i+1, height[i]);
            }
        }
    }
    // 寻找身高从大到小的人
    private void process2(int[] height, int count, int index,int pre) {
        if (index == height.length) {
            return;
        }
        for (int i = index; i < height.length; i++) {
            if (count == 2 && height[i] < pre) {
                res++;
                continue;
            }
            if (pre == -1 || height[i] < pre) {
                process2(height, count+1, i+1, height[i]);
            }
        }
    }

    //[1,5,3,2,4]
    public static void main(String[] args) {
        int[] in = {1,5,3,2,4};
        int i = new Main1().TeamNums(in);
        System.out.println(i);
    }
}

第二题:

给你一个网格,你可以从任意位置进入和退出。
你不可以走重复的路
你不可以走0
你可以上下左右走
你进入一个网格则能收集此网格的资源,求你能收集最大的资源数
输入:[[0,6,0],[5,8,7],[0,9,0]]
输出:24
路径:7-8-9

输入:[[1,0,7],[2,0,6],[3,4,5],[0,3,0],[9,0,20]]
输出:28
路径:1-2-3-4-5-6-7

这题我觉得写的还行,如果有更好的算法请评论区指出哈!!!!!!!

/**
 * @author keboom
 * @date 2021/8/7
 */
public class Solution2 {

    boolean[][] isGo;
    int res = 0;
    int[][] skill;
    public int getMaximumResource (int[][] grid) {
        int row = grid.length;
        int col = grid[0].length;
        isGo = new boolean[row][col];
        skill = new int[][]{{-1, 0}, {1, 0}, {0, 1}, {0, -1}};
        // 那些为0的设置为false
        for (int i = 0; i < row; i++) {
            for (int j = 0; j < col; j++) {
                isGo[i][j] = grid[i][j] == 0 ? false : true;
            }
        }
        for (int i = 0; i < row; i++) {
            for (int j = 0; j < col; j++) {
                if (grid[i][j] != 0) {
                    process(grid, i, j, isGo, 0);
                }
            }
        }
        return res;
    }

    private void process(int[][] grid, int i, int j, boolean[][] isGo, int sum) {
        if (i < 0 || i >= grid.length || j < 0 || j >= grid[0].length || !isGo[i][j]) {
            return;
        }
        isGo[i][j] = false;
        sum += grid[i][j];
        res = Math.max(res, sum);
        for (int[] s : skill) {
            int newX = i + s[0];
            int newY = j + s[1];
            process(grid, newX, newY, isGo, sum);
        }
        isGo[i][j] = true;
    }

    //[[0,6,0],[5,8,7],[0,9,0]]
    public static void main(String[] args) {
        int[][] grid = {{0, 6, 0}, {5, 8, 7}, {0, 9, 0}};
        int res = new Solution2().getMaximumResource(grid);
        System.out.println(res);
    }

}
#奇安信笔试##笔经##奇安信#
全部评论
我俩应该是一套题,那两道我就a了一道收集资源的
1 回复
分享
发布于 2021-08-07 17:08
兄弟安全岗吗?
点赞 回复
分享
发布于 2021-08-07 17:01
秋招专场
校招火热招聘中
官网直投

相关推荐

点赞 评论 收藏
转发
1 6 评论
分享
牛客网
牛客企业服务