京东3.19后端笔试题

代码是可以优化的,随手写的提交比较快看看思路就好细节可以优化完成。
第一题  贪心模拟即可
import java.util.Scanner;

class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int a = in.nextInt(); //坦克
        int b = in.nextInt(); //碉堡血量
        int c = in.nextInt(); //一个碉堡炸c
        int d = in.nextInt(); //碉堡数量
        int cur = b; //初始化血量最少的碉堡血量为cur,刚开始为b
        int count = 0; 
        while (a != 0 && d != 0) { //如果坦克或碉堡任意为0结束
            count++;
            int tank = a; //坦克的攻击力总点数
            if (tank < cur) {
                cur -= tank; //未能消灭碉堡
            } else {
                while (tank >= cur && d != 0) {
                    d--;
                    tank -= cur;
                    cur = b;
                }
                if (d == 0) break; //碉堡全灭直接结束
                cur -= tank;
            }
            if (a - d * c > 0) {
                a = a - d * c; // 坦克未被全灭
            } else {
                a = 0; // 坦克被全灭(包括负数情形都设置为0)
                break;
            }
        }
        if (a == 0 && d != 0) {
            System.out.println(-1);
        } else {
            System.out.println(count);
        }
    }
}
第二题  维护一个最大堆,从任意节点开始遍历,每次取最大value边出来,然后再加入连通的边且下一个点未访问过(保证一个最大所以不走回头路)
import java.util.*;

class edge {
    int dst, value;
}

class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        int m = in.nextInt();
        List<List<edge>> edges = new ArrayList<>();
        for (int i = 0; i <= n; i++) {
            edges.add(new LinkedList<>());
        }
        int u, v, p;
        for (int i = 0; i < m; i++) {
            u = in.nextInt();
            v = in.nextInt();
            p = in.nextInt();
            edge e = new edge();
            e.dst = v;
            e.value = p;
            edges.get(u).add(e);
            edge e1 = new edge();
            e1.dst = u;
            e1.value = p;
            edges.get(v).add(e1); //可以给edge类加上带参构造方法把这一段变成2行时间关系不写了
        }
        Set<Integer> set = new HashSet<>();
        PriorityQueue<edge> pq = new PriorityQueue<>(new Comparator<edge>() { @Override public int compare(edge o1, edge o2) {
                return o2.value - o1.value;
            }
        }); //存放边的大根堆
        set.add(1); //随便选一个点进入set
        pq.addAll(edges.get(1)); //将该点所有连通边加入大根堆
        int max = Integer.MAX_VALUE; //用来维护路径上经过的最大的最小边权
        while (!pq.isEmpty()) {
            edge e = pq.poll();
            max = Math.min(max, e.value);
            set.add(e.dst);
            for (edge edge : edges.get(e.dst)) {
                if (!set.contains(edge.dst)) {
                    pq.add(edge);
                }
            }
            if (set.size() == n) {
                break;
            }
        }
        System.out.println(max);
    }
}

#京东暑期实习##笔经##京东##后端开发#
全部评论
感谢大佬,还贴心的加上了代码注释
点赞 回复 分享
发布于 2022-03-22 16:46

相关推荐

字节搜索二面挂当天被捞1、自我介绍2、你提到了用户的关注与取关,你用户关系服务是怎么设计的?(定义了关注表与粉丝表,两个表内容一致)3、你怎么保证两个表内容一致的?(目前是通过事务保证的,后面其实还可以通过订阅&nbsp;binlog&nbsp;伪从来保证一致性)3、如果是大&nbsp;V&nbsp;的情况,你有考虑到吗,做了哪些处理应对这种高并发(Redis&nbsp;缓存+二级缓存,冷热数据分离)4、分布式&nbsp;ID&nbsp;你都用来生成什么&nbsp;ID&nbsp;的?(笔记&nbsp;ID,用户&nbsp;ID,用户&nbsp;ID&nbsp;用的号段模式,笔记&nbsp;ID&nbsp;考虑到雪花算法自带的时间戳可以实现冷热数据分离,发布久远的笔记不缓存在&nbsp;redis,后由于点赞系统采用咆哮位图高效判断,但咆哮位图基本只能存储&nbsp;32&nbsp;位,遂也改为号段模式生成,生成效率基本没差多少)5、那你说说点赞系统怎么设计的?为什么改为咆哮位图了?(先是采用&nbsp;Set&nbsp;数据结构判断,后因为满足高并发需求,Set&nbsp;模式占用内存太多,又改用布隆过滤器实现,大大降低内存占用。但布隆过滤器在判断存在时存在误判,需要从数据库进行二次校验。后改用咆哮位图,既能高效判断点赞与否,内存占用也大大降低)6、那你讲一下咆哮位图的机制,为什么有你说的这些优点?7、MySQL&nbsp;了解吧,你讲一下&nbsp;MySQL&nbsp;的索引(一顿吟唱)8、说一下聚簇索引和非聚簇索引的区别9、联合索引再说一下,如何定义联合索引最好?(设计成覆盖索引)10、联合索引的顺序重要吗?(顺便再说一下索引下推)11、算法1:二叉树展开为链表12、算法2:根据层序遍历建树反问
查看13道真题和解析
点赞 评论 收藏
分享
评论
3
6
分享

创作者周榜

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