华为2022.9.21笔试题目


第二题参考代码:就是 dfs,分为小兵 和 马状态 两种情况下,进行 dfs就可以了,复杂的O(mn)
package com.example.huawei._9_21;

public class _2_anser {
    public static void main(String[] args) {
        char[][] map = new char[9][];
        map[0] = new char[]{'.','.','.','.','.','.','.','.','.'};
        map[1] = new char[]{'.','.','.','.','.','X','X','X','.'};
        map[2] = new char[]{'.','.','.','.','.','X','.','X','.'};
        map[3] = new char[]{'.','.','.','.','.','X','.','X','.'};
        map[4] = new char[]{'.','.','.','.','.','X','.','X','S'};
        map[5] = new char[]{'X','X','X','X','X','X','.','X','X'};
        map[6] = new char[]{'.','.','.','.','.','.','.','.','.'};
        map[7] = new char[]{'.','.','.','.','.','.','.','.','.'};
        map[8] = new char[]{'.','.','.','.','.','.','.','.','.'};
        System.out.println(getCount(map));


        char[][] map2 = new char[3][];
        map2[0] = new char[]{'S','.'};
        map2[1] = new char[]{'.','.'};
        map2[2] = new char[]{'.','.'};
        System.out.println(getCount(map2));
    }

    public static int getCount(char[][] map){
        int m = map.length;
        int n = map[0].length;

        int[][] timeBin = new int[m][n];
        int[][] timeMa = new int[m][n];
        for(int i = 0 ;i < m ;i ++){
            for(int j = 0 ; j < n;j ++){
                timeBin[i][j] = Integer.MAX_VALUE;
                timeMa[i][j] = Integer.MAX_VALUE;
            }
        }

        dfsBin(map,timeBin,timeMa,0,0,0);
        if(timeBin[m - 1][n - 1] == Integer.MAX_VALUE && timeMa[m - 1][n - 1] == Integer.MAX_VALUE){
            return -1;
        }
        return  Math.min(timeMa[m- 1][n-1],timeBin[m- 1][n-1]);

    }

    public static void dfsBin(char[][] map,int[][] timeBin,int[][] timeMa,int x, int y,int cost){
        if( x < 0 || x >= map[0].length || y < 0 || y >= map.length ){
            return;
        }
        if( map[y][x] == 'X'||timeBin[y][x] <= cost){
            return;
        }
        timeBin[y][x] = cost;
        cost++;

        if(map[y][x] == 'S'){
            dfsMa(map,timeBin,timeMa,x,y,cost);
        }
        dfsBin(map,timeBin,timeMa,x + 1,y,cost);
        dfsBin(map,timeBin,timeMa,x - 1,y,cost);
        dfsBin(map,timeBin,timeMa,x,y - 1,cost);
        dfsBin(map,timeBin,timeMa,x,y + 1,cost);

    }

    public static void dfsMa(char[][] map,int[][] timeBin,int[][] timeMa,int x, int y,int cost){
        if( x < 0 || x >= map[0].length || y < 0 || y >= map.length ){
            return;
        }
        if( map[y][x] == 'X'||timeMa[y][x] <= cost){
            return;
        }
        timeMa[y][x] = cost;
        cost++;
        if(map[y][x] == 'S'){
            dfsBin(map,timeBin,timeMa,x,y,cost);
        }

        dfsMa(map,timeBin,timeMa, x + 1,y - 2,cost);
        dfsMa(map,timeBin,timeMa, x - 1,y - 2,cost);


        dfsMa(map,timeBin,timeMa, x - 1,y + 2,cost);
        dfsMa(map,timeBin,timeMa, x + 1,y + 2,cost);

        dfsMa(map,timeBin,timeMa, x + 2,y + 1,cost);
        dfsMa(map,timeBin,timeMa, x + 2,y - 1,cost);

        dfsMa(map,timeBin,timeMa, x - 2,y + 1,cost);
        dfsMa(map,timeBin,timeMa, x - 2,y - 1,cost);
    }
}

第三题:看起来很复杂,其实很简单,就 dp,也是要分情况,就是某一个树种还是不种,
dp[i][0]表示,在种了第i棵树后,但是后续的树还没有种的情况下所能取到的最大价值
dp[i][1]表示,不种了第i棵树后,但是后续的树还没有种的情况下所能取到的最大价值
首先树得按照树的右边界进行排序
状态方程:
1.dp[i][1] = Max(dp[i-1][0],dp[i-1][1])
2.                tempValue =(dp[0][0] - dp[i-1][0])中,边界不会和 i树 冲突的,最大dp值,因为是按照右边界排序,只要 i 不和 j冲突,就意味值 i 不会和 0到j-1的树冲突
dp[i] = val[i] + tempVale
时间复杂度  O(n^2)
package com.example.huawei._9_21;


public class _3_anser {
    public static void main(String[] args) {
        int n = 4;
        int[] pos = new int[]{2,3,4,5};
        int[] r= new int[]{1,1,1,2};
        int[] val = new int[]{50,10,40,70};
        System.out.println(getMaxValue(n,pos,val,r));

        n = 5;
        pos = new int[]{2,3,6,5,7};
        r= new int[]{1,1,3,1,1};
        val = new int[]{20,20,100,70,60};
        System.out.println(getMaxValue(n,pos,val,r));
    }

    public static int getMaxValue(int n,int[] pos,int[] val,int[] r){
        int res = 0;
        int[][] lance = new int[n][3];

        for(int i = 0; i < n;i++){
            lance[i][0] = pos[i] - r[i];
            lance[i][1] = pos[i] + r[i];
            lance[i][2] = val[i];
        }

                Arrays.sort(lance,(a,b)-> a[1] - b[1]);//注意数组是按照右边界进行排序的,只有保证右边界有序,dp方程才成立

        int[][] dp = new int[n][2];
        dp[0][0] = lance[0][2];//代表种树带来的价值
        dp[0][1] = 0;//代表不种树的价值

        for(int i = 1; i< n;i++){
            int tempValue = 0;
            for(int j = 0;j < i;j++){
                if(lance[j][1] <= lance[i][0])
                    tempValue = Math.max(tempValue,dp[j][0]);
            }
            dp[i][0] = tempValue + lance[i][2]; //加上自己的价值,表示 种了这棵树能达到的最大价值
            dp[i][1] = Math.max(dp[i - 1][1],dp[i - 1][0]);//表示不种这棵树的价值

            res = Math.max(Math.max(res,dp[i][0]),dp[i][1]);
        }
        return res;
    }
}
        





#华为笔试#
全部评论
第二题dfs超时了呀
1 回复 分享
发布于 2022-09-22 12:02 四川
牛得,当时第二题的dfs给我绕晕了。。 你得写法不错
点赞 回复 分享
发布于 2022-09-22 22:12 重庆
楼主,你是什么时候投递的,华子投晚了,不知道还有机会没
点赞 回复 分享
发布于 2022-09-24 08:08 安徽
lz,请问第一题是日志过滤那个吗,你可以私发我一下代码吗?谢谢啦
点赞 回复 分享
发布于 2022-10-02 21:03 北京
楼主,可以讲一下大概的题目吗? !!
点赞 回复 分享
发布于 2022-10-10 22:30 新加坡

相关推荐

01-14 12:08
门头沟学院 Java
神哥了不得:(非引流)1.既然发出来了简历,就稍微提一点点小建议,确实简历很不错了,练手项目可以换一些质量高的,工作内容,可以加上一些量化指标,比如第一条系统响应速度由多少变成多少,减少了百分之多少,第4条就很不错。2.广投,年前实习招募比较少了
点赞 评论 收藏
分享
评论
7
38
分享

创作者周榜

更多
牛客网
牛客企业服务