0819微软笔试

problem 1 :
给定X[],Y[],组成坑洞坐标,现有填坑机,机器填坑宽度是W,沿y轴平行方向填坑,问最少几台机器可以填补所有的坑?
method: 按照X坐标贪心遍历。

problem 2 :
给定字符串S,求S中某些字符组成的最大回文字符串。
eg: "19878" ---"898"
method:    找所有出现偶数次的数字和一个最大的奇数次的数字,偶数次数字排序,由大到小拼接成字符串,中间加上奇数次的一个数字组成回文字符串。
or dfs求所有子集,遍历得到最大的回文字符串。

problem 3:
给定一些房子和办公楼,两点间有一个路线,无环,每个房子楼下都有一辆车,车最多坐5个人,两点间消耗1L油,问,所有房子里的人到达办公楼所需的最小油。
method: 图的bfs遍历,两点间油消耗随此房间当时的人数而变即可。
import java.util.Arrays;
import java.util.LinkedList;

public class Main20 {
    public static void main(String[] args) {
        int[] A = new int[]{1,1,1,9,9,9,9,7,8};
        int[] B = new int[]{2,0,3,1,6,5,4,0,0};
        int res = solution(A, B);
        System.out.println(res);
    }
    public static int solution(int[] A, int[] B) {
        // write your code in Java 8 (Java SE 8)
        //建造入度与邻接矩阵
        int[] inDegree = new int[A.length + 1];
        int[][] matrix = new int[A.length + 1][A.length + 1];
        for(int i = 0; i < A.length; i++){
            matrix[A[i]][B[i]]++;
            matrix[B[i]][A[i]]++;
            inDegree[A[i]]++;
            inDegree[B[i]]++;
        }
        int[] val = new int[A.length + 1];
        //每个节点的初始人数
        Arrays.fill(val, 1);
        LinkedList<Integer> queue = new LinkedList();
        for(int i = 1; i < inDegree.length; i++){
            if(inDegree[i] == 1){
                //即入度为1且不是办公区0的房子入队
                queue.add(i);
            }
        }
        int res = 0;
        while(!queue.isEmpty()){
            int len = queue.size();
            for(int i = 0; i < len ; i++){
                int tmp = queue.remove();
                //将此房子的人移到另一个房子内即可
                //计算移动当前房间人所需的油
                if(val[tmp] % 5 == 0){
                    res += val[tmp] / 5;
                }else{
                    res += val[tmp] / 5 + 1;
                }
                //找到其下一个房子是哪个
                for(int j = 0; j < inDegree.length; j++){
                    if(matrix[tmp][j] == 1){
                        matrix[tmp][j]--;
                        matrix[j][tmp]--;
                        inDegree[j]--;
                        inDegree[tmp]--;
                        //非办公区的房子且入度为1,入队
                        if(j != 0 && inDegree[j] == 1){
                            queue.add(j);
                        }
                        //人数要加上之前的人
                        val[j] += val[tmp];
                    }
                }
            }
        }
        return res;
    }
}


全部评论
我以为是今天考。。
1 回复 分享
发布于 2022-08-20 14:10 广东
大哥是参加了三次吗?怎么申请再次笔试的机会😂
点赞 回复 分享
发布于 2022-08-20 18:13 广东
第二题不需要是偶数次吧,比如说5个9,取4个9组成左右各两个9的回文
点赞 回复 分享
发布于 2022-08-20 10:17 浙江
这是拓扑排序啊,为什么叫bfs呢?
点赞 回复 分享
发布于 2022-08-19 23:03 陕西
第三题咋做大哥 答案能不能参考一下啊
点赞 回复 分享
发布于 2022-08-19 22:30 上海
笔试系统的输出准确吗?我啥也不写也显示ok是啥情况呀
点赞 回复 分享
发布于 2022-08-19 22:21 江苏
ac了前两道,第三道建完图没写出来
点赞 回复 分享
发布于 2022-08-19 22:21 江苏

相关推荐

点赞 评论 收藏
分享
frutiger:逆天,我家就安阳的,这hr咋能说3k的,你送外卖不比这工资高得多?还说大厂来的6k,打发叫花子的呢?这hr是怎么做到说昧良心的话的
找工作时遇到的神仙HR
点赞 评论 收藏
分享
07-15 14:14
门头沟学院 Java
7.10投递7.15感谢信
投递地平线等公司7个岗位
点赞 评论 收藏
分享
评论
5
19
分享

创作者周榜

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