华为机试8.25ak代码

55分钟ak,九点钟更新代码
------------分割线-----------

第一题

题目大意:
给你一个矩阵,求最大子矩阵和
package nowcoder;

import java.io.BufferedInputStream;
import java.util.Scanner;

public class Main47 {
    public static void main(String[] args) {
        new Solve47().solve();
    }
}
class Solve47{
    public void solve(){
        Scanner s=new Scanner(new BufferedInputStream(System.in));
        int m=s.nextInt();
        int n=s.nextInt();
        int[][] martrix=new int[m][n];
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                martrix[i][j]=s.nextInt();
            }
        }
        int ans=Integer.MIN_VALUE;
        for (int i = 0; i <m ; i++) {
            int[] dp=new int[n];
            for (int j = i; j < m; j++) {
                for (int k = 0; k < n; k++) {
                    dp[k]+=martrix[j][k];
                }
                int[] sum=new int[n];
                int min=0;
                for (int k = 0; k < n; k++) {
                    sum[k]+=dp[k];
                    if (k>0)sum[k]+=sum[k-1];
                    ans=Math.max(ans,sum[k]-min);
                    min=Math.min(min,sum[k]);
                }
//                System.out.println(Arrays.toString(sum));
            }

        }
        System.out.println(ans);
    }
}

第二题

题目大意:
给你一个矩阵代表一个闯关方格,英雄最开始在(0,0)处,移动一次耗费1s,闯关方格上的数字代表着倒计时,每过一秒减一,当减到0时该格子无法通过,求到右下角的最短时间

BFS搜索加剪枝即可
package nowcoder;

import java.io.BufferedInputStream;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;

public class Main48 {
    public static void main(String[] args) {
        new Solve48().solve();
    }
}

class Solve48{
    int row,col;
    int[] dx={-1,1,0,0};
    int[] dy={0,0,1,-1};
    private class Node{
        int x;
        int y;
        int hop;

        public Node(int x, int y, int hop) {
            this.x = x;
            this.y = y;
            this.hop = hop;
        }
    }
    public void solve(){
        Scanner s=new Scanner(new BufferedInputStream(System.in));
        row=s.nextInt();
        col=s.nextInt();
        int[][] grid=new int[row][col];
        for (int i = 0; i <row ; i++) {
            for (int j = 0; j < col; j++) {
                grid[i][j]=s.nextInt();
            }
        }
        System.out.println(getAns(grid));

    }
    private int getAns(int[][] grid){
        if (grid[0][0]<=0){
            return -1;
        }
        int[][] minTime=new int[row][col];
        for (int i = 0; i < row; i++) {
            Arrays.fill(minTime[i],Integer.MAX_VALUE);
        }
        Queue<Node> queue=new LinkedList<>();
        queue.add(new Node(0,0,0));
        while (!queue.isEmpty()){
            Node node=queue.poll();
            int x=node.x;
            int y=node.y;
            int hop=node.hop;
//            System.out.println(x+" "+y+" "+hop);
            if (minTime[x][y]<=hop||grid[x][y]<hop)continue;
            minTime[x][y]=hop;
            if (x==row-1&&y==col-1)return hop;
            for (int i = 0; i < dx.length; i++) {
                int nextX=dx[i]+x;
                int nextY=dy[i]+y;
                if (!inGrid(nextX,nextY))continue;
                queue.add(new Node(nextX,nextY,hop+1));
            }
        }
        return -1;
    }
    private boolean inGrid(int x,int y){
        return x>=0&&x<row&&y>=0&&y<col;
    }
}

第三题

题目大意:给你一系列任务的完成时间及其前置依赖,任务可以并行,求完成所有任务的最短时间
输入:
第一行一个数n代表有n个任务,接下来n行代表每个任务的信息
当没有前置依赖的时候,这一行为-1 t,t代表完成时间
当有前置依赖的时候,前置依赖间用逗号隔开,1,2 t,t代表完成时间
Java split处理字符串yyds
拓扑排序加dp,其中dp[i]代表完成第i个任务需要的时间
package nowcoder;

import java.io.BufferedInputStream;
import java.util.*;

public class Main49 {
    public static void main(String[] args) {
        new Solve49().solve();
    }
}

class Solve49{
    public void solve(){
        Scanner s=new Scanner(new BufferedInputStream(System.in));
        int n=s.nextInt();
        int[] times=new int[n];
        s.nextLine();
        List<List<Integer>> graph=new ArrayList<>();
        for (int i = 0; i < n; i++) {
            graph.add(new ArrayList<>());
        }
        for (int i = 0; i < n; i++) {
            String str=s.nextLine();
            String[] strs=str.split(",");
            for (int j = 0; j <strs.length-1 ; j++) {
                int a=Integer.parseInt(strs[j]);
                graph.get(a).add(i);
            }
            String[] curr=strs[strs.length-1].split(" ");
            if (!curr[0].equals("-1")){
                int a=Integer.parseInt(curr[0]);
                graph.get(a).add(i);
            }
            int t=Integer.parseInt(curr[1]);
            times[i]=t;
        }
        System.out.println(getAns(times,graph,n));
    }
    private int getAns(int[] times,List<List<Integer>> graph,int n){
        int[] in=new int[n];
        for(List<Integer> list:graph){
            for(int i:list)in[i]++;
        }
        Queue<Integer> queue=new LinkedList<>();
        int[] dp=new int[n];
        Arrays.fill(dp,0);
        int cnt=0;
        for (int i = 0; i < n; i++) {
            if (in[i]==0){
                dp[i]=times[i];
                queue.add(i);
            }
        }
        while (!queue.isEmpty()){
            int curr=queue.poll();
            cnt++;
            for(int i:graph.get(curr)){
                in[i]--;
                dp[i]=Math.max(dp[i],dp[curr]+times[i]);
                if (in[i]==0)queue.add(i);
            }
        }
        if (cnt!=n)return -1;
        int ans=0;
        for (int i = 0; i <dp.length ; i++) {
            ans=Math.max(ans,dp[i]);
        }
        return ans;
    }

}


全部评论
只有我觉得这次题目难吗?
11 回复 分享
发布于 2021-08-25 20:55
第二题return m + n - 2过90%
8 回复 分享
发布于 2021-08-25 21:13
作者:今天也要卷的开心嗷 链接:https://www.nowcoder.com/discuss/720011?type=post&order=time&pos=&page=1&ncTraceId=&channel=-1&source_id=search_post_nctrack 来源:牛客网 第一题  最大子矩阵 给定一个二维整数矩阵,选其中一个子矩阵,使得这个子矩阵内的所有数字和是最大的。 输入 第一行n m ∈[1,10] 表示矩阵大小; 下面多行表示输入矩阵,元素大小在[-1000,1000]; 输出 输出一个整数,代表最大和。 第二题  逃出生天 给一张row*col地图,地图上每个点都有一个倒计时装置,为0就会成陷阱,使得这个点不能通过,在地图上每移动一个点消耗1s。可以上下左右移动,请找到一条最佳路线,在最短时间内从起点[0,0]到终点[row-1,col-1]。 输入 第一行 row col ∈[1,15]; 下面多行代表地图,元素大小为倒计时,∈[0,100]; 输出 最短时间,若没有,输出-1 第三题  任务调度 需要完成一系列任务,任务之间存在依赖关系,比如A依赖B,那么A必须在B完成后才能做。 给出n个任务的依赖关系和运行时间,n<=10000,计算这n个任务执行完成所需要的时间,如果有依赖循环输出-1。 输入 第一行 任务个数n 下面多行为n个任务的信息,第一部分为依赖的任务ID,为整数,索引从0开始,第二部分为运行时间。 任务可能依赖多个其他任务,多个任务ID用逗号分隔,如果任务不依赖其他任何任务,依赖ID为-1。 输出 所有任务运行完所需要的时间,若依赖循环则-1.
2 回复 分享
发布于 2021-08-31 17:09
ak是啥
2 回复 分享
发布于 2021-08-25 21:00
第一题的29-36的代码可读性有点差了,其实就是计算dp[]中连续最大值.用下面代码可能更易阅读点                 int sum = 0;                 for(int k=0;k<n;k++){                     sum += dp[k];                     ans = Math.max(sum,ans);                     if(sum <= 0 )sum=0;                 }
1 回复 分享
发布于 2021-08-26 11:33
第二题dfs直接超时😓
1 回复 分享
发布于 2021-08-25 21:01
最后一题死活85,服了
1 回复 分享
发布于 2021-08-25 21:01
前两个ac 最后一个就剩20分钟直接输出-1骗分🤣
1 回复 分享
发布于 2021-08-25 20:45
问一下,相当于力扣什么难度
1 回复 分享
发布于 2021-08-25 20:39
有没有详细讲解呀,跪求python版本解法
点赞 回复 分享
发布于 2021-09-12 23:20
不是求最短时间么,为什么动态规划要max
点赞 回复 分享
发布于 2021-09-11 16:31
请问有有人提供C++的版本吗
点赞 回复 分享
发布于 2021-08-27 20:39
英雄闯关,输出20,有20%,这就是从-1一直试着输出到20的最高结果
点赞 回复 分享
发布于 2021-08-26 11:40
ak是什么意思
点赞 回复 分享
发布于 2021-08-26 11:36
华为笔试题本身不难,前几次被吐槽好像是输入里面要处理逗号,估计被吐槽多了就改了。
点赞 回复 分享
发布于 2021-08-26 09:01
各位大佬,每道题是算测试用例通过最高的一次,还是最后的一次
点赞 回复 分享
发布于 2021-08-26 08:23
大佬们你们都是什么题啊,我的是爬楼梯,分礼物和最少油量
点赞 回复 分享
发布于 2021-08-26 03:01
考的题目不一样吗,为啥看着有点陌生呢
点赞 回复 分享
发布于 2021-08-26 03:00
第一题是力扣上面Hard原题啊(面试题 17.24. 最大子矩阵),第一题都这么难。。。。。
点赞 回复 分享
发布于 2021-08-26 01:03
楼主或者哪位小伙伴能描述一下题吗?谢谢谢谢!
点赞 回复 分享
发布于 2021-08-25 23:31

相关推荐

华为终究还是没走到最后,倒在了主管面,不甘心,不甘心啊
想去重庆的鸽子在吐槽:不用硬顶着17级台风上班了
点赞 评论 收藏
分享
评论
42
105
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务