美团2019秋招后台开发编程题题解

图的遍历

题目描述

给定一张包含N个点、N-1条边的无向连通图,节点从1到N编号,每条边的长度均为1。假设你从1号节点出发并打算遍历所有节点,那么总路程至少是多少?

输入

第一行包含一个整数N,1≤N≤105。

接下来N-1行,每行包含两个整数X和Y,表示X号节点和Y号节点之间有一条边,1≤X,Y≤N。

输出

输出总路程的最小值。

样例输入

4
1 2
1 3
3 4

样例输出

4

Hint
按1->2->1->3->4的路线遍历所有节点,总路程为4。

思路

遍历所有节点类似于深度优先搜索,也就是说除了最后一条路径外,走了两遍,设最后一条路径为depth,总分支数为N-1,总路径=2 * (N-1-x)+x=2 * N - 2 - depth,当depth最大时总路径最小,所以转化为求二叉树的深度。

代码实现

package meituan;

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int N = sc.nextInt();
        int[] t = new int[100005];
        int x, y;
        for (int i = 0; i < N - 1; i++) {
            x = sc.nextInt();
            y = sc.nextInt();
            t[y] = t[x] + 1;
        }
        int depth = 0;
        for (int i = 1; i <= N; i++) {
            depth = t[i] > depth ? t[i] : depth;
        }
        System.out.println(2 * N - 2 - depth);
    }
}

区间统计

题目描述

小明拿到了一个数列a1 , a2 , ... an ,小明想知道存在多少个区间[l,r]同时满足下列两个条件:

1、r-l+1=k;

2、在a l , a l+1,...ar中,存在一个数至少出现了 t 次。

输出满足条件的区间个数。

输入

输入第一行三个整数n,k,t(1≤n,k,t≤10^5)。

第二行 n 个整数,a1 , a2 , ... an (1≤ai≤10^5)。

输出

输出一个数,问题的答案。

样例输入

5 3 2
3 1 1 1 2

样例输出

3

Hint

区间[1,3]中1出现了2次,区间[2,4]中1出现了3次,区间[3,5]中1出现了2次。所以一共有3个区间满足条件。

思路

滑动窗口维护区间中数字出现大于等于t次的个数

代码实现

package meituan;

import java.util.Scanner;

public class Main2 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int k = sc.nextInt();
        int t = sc.nextInt();
        if (k > n || t > n) {
            System.out.println(0);
        }
        int[] num = new int[n];
        int[] ct = new int[n];
        int cnt = 0;
        int ans = 0;
        for (int i = 0; i < n; ++i) {
            num[i] = sc.nextInt();
        }
        for (int i = 0; i < k - 1; i++) {
            ct[num[i]]++;
            if (ct[num[i]] >= t && ct[num[i]] - 1 < t) {
                cnt++;
            }
        }
        for (int i = k - 1; i < n; i++) {
            ct[num[i]]++;
            if (ct[num[i]] >= t && ct[num[i]] - 1 < t) {
                cnt++;
            }
            if (cnt > 0) {
                ans++;
            }
            ct[num[i - k + 1]]--;
            if (ct[num[i - k + 1]] < t && ct[num[i - k + 1]] + 1 >= t) {
                cnt--;
            }
        }
        System.out.println(ans);
    }
}

原文地址:https://www.cnblogs.com/wupeixuan/p/9603558.html

时间: 2024-08-01 22:36:08

美团2019秋招后台开发编程题题解的相关文章

搜狗2019秋招的一道算法题:龟兔赛跑

时间限制:3秒 空间限制:92160K 定义如下图所示的比赛地图: S表示比赛起点,E表示比赛终点.实线表示陆路,虚线表示水路.兔子只能走陆路,乌龟既可以走陆路也可以走水路.每条路径的长度在图中给出.假定兔子和乌龟足够聪明,问谁先到达终点. 输入描述: 第1行输入v1,v2.v1是兔子的速度,v2是乌龟的速度(水路.陆路速度相同).第2行输入n,m,点的编号是1~n,然后是m行,其中1是起点,n是终点(路径本身不限定方向).下面m行4个数 a, b, d, c,表示a和b之间有一条边,且其长度为

2017年腾讯 秋招软件开发笔试编程题回忆版

2017年腾讯秋招软件开发笔试编程题回忆版 (所有题目大致描述如下,并非完整的题目回忆,但意思大致一样) 1.又一个魔法城市,城市里面有n个魔法城堡,序号为0,1,2...n-1:魔法城堡之间都有路径相连:魔法城堡两两之间的到达的距离不同,因此所需时间也可能不会相同.如魔法城堡0到魔法城堡2需要耗时4小时:现,小明想从魔法城堡0到魔法城堡1,他想知道需要花费多少时间:为了快速到达,有一魔法扫把,魔法扫把使用次数有限,使用一次,可以将某一段间的时间减半:求小明从魔法城堡0到魔法城堡1花费的最小时间

[找工作] 2019秋招|从春招到秋招,Java岗经验总结(收获AT)

转自(有更多) https://blog.csdn.net/zj15527620802/article/month/2018/10 前言 找工作是一件辛酸而又难忘的历程.经历过焦虑.等待.希望,我们最终都能去到属于自己理想的地方. 从春招到秋招,我总计面试了数十家公司.春招面试了腾讯.去哪儿.360.小米.携程.华为.今日头条.美团.菜鸟网络等9家公司.除了今日头条止步三面.菜鸟物流备胎至七月底才回绝,其他公司均通过了面试.最后在美团和腾讯中纠结了一段时间后,选择了腾讯去实习.秋招腾讯转正的还算

2019秋招软件工程师面经

秋招已经尘埃落定,十月下旬把三方寄出去之后又出去玩了一周,现在开始复盘整个秋招. 首先,这两年互联网行业真的行业不太好,很多公司的岗位趋于饱和,门槛也高了不少(我自己在秋招过程中的感觉,也可能是我自己菜,菜是原罪),找工作要很早开始准备才行. 个人的一些信息:大四应届生,软件工程专业,成绩还行. 关于读研与否的选择:这个问题在面试过程中被问过好几次,我是寒假下定的决心,之后几乎就没再动摇过.我找到了一张当时的自己的微博截图: 总而言之还是自己太菜了叭,感觉自己搞不来科研,而且本科毕业搞搞开发..

2015阿里秋招其中一个算法题(经典)

写一个函数,输入一个二叉树,树中每个节点存放了一个整数值,函数返回这棵二叉树中相差最大的两个节点间的差值绝对值.请注意程序效率 这是2015阿里秋招的一个在线笔试题 实现方法很简单,遍历一遍二叉树,找出最大最小,一相减就可以求出最大的差值 之前在做题的时候居然写递归的方法求值,后面测试了一下,果然结果不对 只要是非递归的的方法遍历都可以很容易找出最大值最小值,效率也比较高,时间复杂度为O(n). 下面是我用非递归从上往下遍历二叉树的方法 用队列容器即可方便实现. 我写的代码: #include

链家秋招内推编程笔试题目

参加8.19的链家内推笔试,总体来说题目难度不大,20个选择题还有三道编程题. 选择题,里面有两道关于IP地址计算的题目,有点忘了,不知道最后的计算有没有问题,所以还需要复习学习完的知识, 因为不知道什么时候就会遇到相关的问题. 编程题,自我感觉,难度是偏简单的,如果不能达到两道AC,那就是不合格了. 1. 给定的一个1,2,3组成的数字序列,排成升序所需的最少交换次数 . 样例输入: 9 2 2 1 3 3 3 2 3 1 样例输出: 4 思路: 应使用贪心算法. 分析:先存入数组,然后记录有

360春招技术岗编程题

360公司 2018校招 技术综合G卷在线考试编程题| 30.0分3/3[本题为选答题]奇异 长度(Web)时间限制:C/C++语言 1000MS:其他语言 3000MS内存限制:C/C++语言 65536KB:其他语言 589824KB 题目描述:给你一个图,0节点连接这一个联通块a,1节点连接着一个联通块b,ab仅由01这条边相连.现在我们定义奇异路径为恰好经过0-1这条边一次的路径,其他边可以经过任意次,且路径不带方向,1-2-3与3-2-1认为是两条路径.重边也算多条路.在这个图中有无数

多益游戏研发笔试-2019秋招

今天...早上10点赶去西电去参加了宣讲会,完了做了一个笔试....估计没什么情况.编程题不会做.下午又做了平安产险的笔试(比较随便,编程是一道Leetcode简单题吧---求最大连续子数组的和O(n)),晚上通知去第二天面试. 晚上刚做完多益的笔试,比较正经. 1. 20道选择,涉及算法数据库和操作系统方面的知识: 2. 6道填空题,涉及数据结构和算法: 3. 简答题:一个英翻汉,一个数据库,还有一个多线程和多进程的区别: 4. 一道编程:O(n)洗牌算法,忘记了,写了一个大于O(n)的. 贴

1.虎牙直播2019秋招编程题

第一题: #include <iostream> #include <string> using namespace std; bool IsVoChar(char c) { return (c == 'a') || (c == 'e') || (c == 'o') || (c == 'i') || (c == 'u') || (c == 'A') || (c == 'E') || (c == 'O') || (c == 'I') || (c == 'U'); } string r