2024年3月9日美团笔试解答

news2025/1/17 3:01:42

在这里插入图片描述
这题打卡题,先扫描一遍原本有n个M和T,然后总数减一下,剩下m个,再看可以添加k个,返回n+min(m,k)

  • Python解答
import time
import bisect
import functools
import math
import os
import random
import re
import sys
import threading
from collections import Counter, defaultdict, deque
from copy import deepcopy
from functools import cmp_to_key, lru_cache, reduce
from heapq import heapify, heappop, heappush, heappushpop, nlargest, nsmallest
from io import BytesIO, IOBase
from itertools import accumulate, combinations, permutations
from operator import add, iand, ior, itemgetter, mul, xor
from string import ascii_lowercase, ascii_uppercase
from typing import *

input = lambda: sys.stdin.readline().rstrip("\r\n")
n, k = map(int, input().split())
s = input()
ans = 0
tot = 0
for i, c in enumerate(s):
    if not(c == "M" or c == "T"):
        tot += 1

if k >= tot:
    print(n)
else:
    print(n - tot + k)

在这里插入图片描述
在这里插入图片描述

依旧是打卡题,最大最小理所应当的是当未知数分别取l和r时成立。

import sys
input = lambda: sys.stdin.readline().rstrip("\r\n")

n, q = list(map(int, input().split()))
a = list(map(int, input().split()))
tot = sum(a)
numa = sum([1 if x == 0 else 0 for x in a])
for _ in range(q):
    l, r = list(map(int, input().split()))
    print(numa * l + tot, numa * r + tot)

在这里插入图片描述
本题解法为二维前缀和,数据量较小,前缀和+暴力就行了,第一遍扫描的时候统计左上角顶点为(0,0),右下角顶点为(i,j)的矩形中0-1的差值,map[i][j]=map[i-1][j]+map[i][j-1]-map[i-1][j-1]的0和1。第二遍扫描的时候左下角差值和右上角差值进行比较就行了,时间复杂度O(n3)

import sys
input = lambda: sys.stdin.readline().rstrip("\r\n")

n = int(input())
g = [[] for _ in range(n)]
for i in range(n):
    s = input()
    for c in s:
        g[i].append(int(c))
prefix = [[0] * (n + 1) for _ in range(n + 1)]
for i in range(n):
    for j in range(n):
        prefix[i + 1][j + 1] = prefix[i][j + 1] + prefix[i + 1][j] - prefix[i][j] + g[i][j]
def work(k):
    cnt = 0
    for i in range(k, n + 1):
        for j in range(k, n + 1):
            di, dj = i - k, j - k
            tot = prefix[i][j] - prefix[i][dj] - prefix[di][j] + prefix[di][dj]
            if tot == k * k // 2:
                cnt += 1
    return cnt

for i in range(n):
    if (i + 1) % 2 == 1:
        print(0)
    else:
        print(work(i + 1))

在这里插入图片描述
在这里插入图片描述

首先,想要得到末尾是0就必须有一对2和5,简单的数学知识。然后接下来有两种解法,第一是使用线段树,查找每个区域2和5的数量,不过这里不需要,且时间复杂度比第二种高;第二种使用前缀和+双指针,可以优化到O(n)复杂度。
具体看注释

import java.util.*;
import java.util.stream.Stream;
import java.lang.Math;

public class Main {
	# 寻找有多少2
    private static int getTwoNum(int x){
        int ct =0;
        while (x % 2 == 0){
            ct++;
            x/=2;
        }
        return ct;
    }
    # 寻找有多少5
    private static int getFiveNum(int x){
        int ct =0;
        while (x % 5 == 0){
            ct++;
            x/=5;
        }
        return ct;
    }

    public static void main(String[] args){
        Scanner in = new Scanner(System.in);
        while (in.hasNext()) {
            int n = in.nextInt();
            int k = in.nextInt();
            int[] arrsTwoNum = new int[n];
            int[] arrsFiveNum = new int[n];
            int totTwoNum = 0; int totFiveNum = 0;
            for (int i = 0; i < n; i++){
                int x = in.nextInt();
                arrsTwoNum[i] = getTwoNum(x);
                arrsFiveNum[i] = getFiveNum(x);
                totTwoNum += arrsTwoNum[i];
                totFiveNum += arrsFiveNum[i];
            }
            if (totTwoNum < k || totFiveNum < k){
                System.out.println(0);
                return;
            }
            int rangeMaxTwoNum = totTwoNum-k; #最大可用删除的2的数量
            int rangeMaxFiveNum = totFiveNum-k;#最大可用删除的5的数量
            int ans = 0;
            #前缀和,统计到i为止25的数量
            for (int i = 1; i < n; i++){
                arrsTwoNum[i]+=arrsTwoNum[i-1];
                arrsFiveNum[i]+=arrsFiveNum[i-1];
            }
            int j = 0; 快指针
            while (j < n && arrsTwoNum[j]<=rangeMaxTwoNum && arrsFiveNum[j]<= rangeMaxFiveNum){
                j++;
            }
            ans += j; #每次快指针使得段内25超标,更新一次ans
            for (int i = 0; i < n; i++){
                while (j < n && arrsTwoNum[j]-arrsTwoNum[i]<=rangeMaxTwoNum && arrsFiveNum[j]-arrsFiveNum[i]<= rangeMaxFiveNum){
                    j++;
                }
                ans+=(j-i-1);
            }
            System.out.println(ans);
        }
    }
}

在这里插入图片描述
在这里插入图片描述
压轴题,帮美团笔试挽尊。但是不要被109的节点数量级骗了,注意边最多只有105,也就是存在大量节点是孤立的,筛选后需要考虑的也就105数量级。
很显然,检查两个节点是否连接的话,使用最小连通图的算法时间复杂度必然是不够的,而且我们也不需要知道二者之间有多少跳,只要使用并查集就行了。(不会并查集的可以直接跳了,先去学并查集)
但是并查集存在一个问题,就是当每次删除一条边之后,无法直接判断有没有出现新的集合。而我们也不可能每次删掉边之后重新计算一遍集合,该时间复杂度无法接受O(qm)。
但是,本题不要以流处理的想法来思考,而是应当看清,这题是批处理的题目。换句话说,我们可以把减法变为加法,倒过来计算每一次查询。而对于并查集而言,每次加入一条边,进行合并的复杂度仅为O(1).

import sys
from copy import deepcopy
from collections import defaultdict
input = lambda: sys.stdin.readline().rstrip("\r\n")

class DSU:
    def __init__(self, n):
        self.p = list(range(n))
        self.size = [1] * n
    def find(self, x):
        if x != self.p[x]:
            self.p[x] = self.find(self.p[x])
        return self.p[x]
    def union(self, x, y):
        x, y = self.p[x], self.p[y]
        if x == y: return
        if self.size[x] > self.size[y]:
            x, y = y, x
        self.size[y] += self.size[x]
        self.p[x] = y

n, m, q = map(int, input().split())
# 先把有关系的人放到一起,然后离散化一下即可,没有关系的不用管
f = set()
all = defaultdict(int)
ct = 0
for _ in range(m):
    u, v = map(int, input().split())
    if u > v: u, v = v, u
    if u not in all:
        all[u] = ct
        ct+=1
    if v not in all:
        all[v] = ct
        ct += 1
ops = []
opuv = set()
for _ in range(q):
    op, u, v = map(int, input().split())
    if u > v:
        u, v = v, u
    ops.append((op, u, v))
    # 如果是删除操作,记录到opuv
    if op == 1:
        opuv.add((u, v))
    if u not in all:
        all[u] = ct
        ct += 1
    if v not in all:
        all[v] = ct
        ct += 1
# print(all)

ans = []
# 先把后面的删除,然后建立并查集,然后倒着加边,如果不在原来的关系里面的边,不用加进去
fc = deepcopy(f)
for u, v in opuv:
    if (u, v) in fc:
        fc.remove((u, v))
m = len(all)
uf = DSU(m)
# print(f, fc)
for u, v in fc:
    u, v = all[u], all[v]
    uf.union(u, v)
ops = ops[::-1]
# print(ops)
for op, u, v in ops:
    if u > v: u, v = v, u
    idu, idv = all[u], all[v]
    if op == 2:
        idu, idv = uf.find(idu), uf.find(idv)
        if idu == idv:
            ans.append("Yes")
        else:
            ans.append("No")
    else:
        # 如果当前的这个不在f中,比如说1,5就不用加进去
        if (u, v) in f:
            uf.union(idu, idv)

for a in range(len(ans)-1,-1,-1):
    print(ans[a])

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1513394.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux 动态库和静态库 【详解】

动静态库的基本原理 静态库&#xff08;.a&#xff09;&#xff1a;程序在编译链接的时候把库的代码链接到可执行文件中。程序运行的时候将不再需要静态库动态库&#xff08;.so&#xff09;&#xff1a;程序在运行的时候才去链接动态库的代码&#xff0c;多个程序共享使用库的…

uniapp使用openlayers加载地图服务

uniapp使用openlayers加载地图服务 <!-- 地图组件 --> <template><view id"myMap" :regionChangeItem"regionChangeItem" :change:regionChangeItem"olRender.selectAdministrativeRegion":tagSelectProducetagSelectProduce :ta…

数字图像处理 使用C#进行图像处理九 实现傅里叶变换

一、简述 傅立叶变换将图像分解为其正弦和余弦分量。换句话说,它将图像从空间域变换到频率域。这个想法是任何函数都可以用无限正弦函数和余弦函数之和来精确近似。傅里叶变换是实现此目的的一种方法。 网上有很多关于傅里叶变换的文章,这里就不进行赘述了,这里主要结合代码…

JS:36种原生JS数组方法(8种改变原数组方法,28种不涉及数组改变的方法)

一、改变原数组方法 1.push() 作用&#xff1a;向数组的末尾添加一个或多个元素 返回&#xff1a;添加后数组的长度。 <script>let arr [1, 2, 3];console.log(arr.push(4)); //4console.log(arr); //[1, 2, 3, 4]console.log(arr.push(2, 4)); //6console.log(arr);…

cad转shp再转3dtiles生成白模

1、准备CAD数据 2、arcgis中添加cad数据 添加面 cad中的标高字段是能带进arcgis中的&#xff0c;如果这个数据是建筑高度&#xff0c;可以直接用了 3、转shp 4、shp转3dtiles白模 cesiumlab中shp转3dtiles白模效果一

新零售SaaS架构:什么是线上商城系统?

零售商家为什么要建设线上商城 传统的实体门店服务范围有限&#xff0c;只能吸引周边500米内的消费者。因此&#xff0c;如何拓展服务范围&#xff0c;吸引更多消费者到店&#xff0c;成为了店家迫切需要解决的问题。 缺乏忠实顾客&#xff0c;客户基础不稳&#xff0c;往往是…

buuctf warmup

1.代码审计&#xff1a; <?phphighlight_file(__FILE__);class emmm //定义了一个类{public static function checkFile(&$page) 类里面又申明创建了一个函数{$whitelist ["source">"source.php","…

安装汇春MDTIDE以及HI-TECH PICCv9.83(PICC语言编译器)

最近了解了汇春一款8位通用型MCU----MDT10F684&#xff0c;所以这里安装一下IDE以及配置一下环境。 1.安装汇春MDTIDE 去到官网下载对应的开发包&#xff0c;我不知道里面内容是否一致。 Flash/MTP MCU (yspringtech.com) 不要点说明书下载&#xff0c;点了没反应&#xff0…

借助ChatGPT提高编程效率指南

PS: ChatGPT无限次数&#xff0c;无需魔法&#xff0c;登录即可使用,网页打开下面 一、借助ChatGPT提高编程效率指南 随着计算机技术的飞速发展&#xff0c;编程已经成为了现代社会中一个非常重要的技能。对于许多人来说&#xff0c;编程不仅是一项工作技能&#xff0c;而且是…

docker之自己制作jdk镜像

一&#xff0c;下载想要制作的镜像的对应jdk&#xff08;自行下载&#xff09;&#xff0c;本文使用jdk17&#xff08;因为自己的springboot项目时在jdk17下开发的&#xff0c;悲&#xff01;&#xff01;&#xff01;&#xff0c;再加上没有在官网上找到对应镜像&#xff0c;只…

ubuntu22.04 在wifi网络正常使用的情况下创建热点连接

ubuntu22.04 在wifi网络正常使用的情况下创建热点连接 在ubuntu22.04版本中正常通过设置打开wifi热点会取消正常的wifi网络连接 接下来让我们一起尝试在wifi网络正常的情况下创建热点连接 查看硬件是否支持 iw list | grep AP #查看是否支持AP模式 Device supports AP-side…

小米官网登录注册的滑动效果

小米官网登录注册的滑动效果 登录组成页面 <div class"client"><div class"userbox"><div class"title"><a href"javascript:;" class"active" id"DL">登录</a><a href&quo…

250+可用的 AI 资源网站

&#x1f482; 个人网站:【 海拥】【神级代码资源网站】【办公神器】&#x1f91f; 基于Web端打造的&#xff1a;&#x1f449;轻量化工具创作平台&#x1f485; 想寻找共同学习交流的小伙伴&#xff0c;请点击【全栈技术交流群】 这里是关于AI网站的一份资源列表。欢迎访问该链…

message: apoc.meta.data is unavailable

报错内容 Traceback (most recent call last):File "/langchain-master/templates/neo4j-semantic-ollama/ingest.py", line 9, in <module>graph Neo4jGraph()File "/root/anaconda3/envs/sakura/lib/python3.9/site-packages/langchain_community/gra…

智慧农业新篇章:DSSAT模型、APSIM模型、WOFOST与PCSE模型综合应用,引领作物生长模拟与产量预测新潮流

目录 ★WOFOST模型与PCSE模型应用 ★基于R语言APSIM模型进阶应用与参数优化、批量模拟 ★最新DSSAT作物模型建模方法及应用 ★基于Python语言快速批量运行DSSAT模型及交叉融合、扩展应用 ★R语言与作物模型&#xff08;以DSSAT模型为例&#xff09;融合应用 ★遥感数据与…

酷开科技以消费者需求为导向冲刺OTT行业的星辰大海

通过大屏营销、互动营销等方式&#xff0c;提升品牌认知度和市场竞争力。酷开科技始终坚持以消费者的需求为导向&#xff0c;致力于为品牌方和消费者搭建高效、准确的沟通桥梁&#xff0c;开创OTT大屏营销新纪元。 伴随技术发展&#xff0c;智能电视已经从“尝鲜”变成了主流产…

C# Web自动化--Selenium入门

安装依赖库 需要引用的核心库是Selenium.RC&#xff0c;Selenium.Support&#xff0c;Selenium.WebDriver 然后再需要引用 浏览器驱动库&#xff0c;这里我以IE浏览器为例&#xff0c;Chrome使用方式跟IE是一样的&#xff0c;程序包名称为Selenium.WebDriver.ChromeDriver。 …

静电ESD整改:原因、影响与解决方案详解?|深圳比创达电子

静电&#xff08;ESD&#xff09;是在日常生活和工作中常见的现象&#xff0c;但它可能对电子设备和器件造成严重的损坏。本文将介绍静电ESD的定义、原因、影响以及解决方案&#xff0c;帮助大家更好地了解ESD问题&#xff0c;并采取相应的整改措施。 一、静电ESD的定义 静电…

技术驱动校园招聘:Java+SpringBoot+Vue的实践之旅

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

【Linux操作系统】:Linux进程概念(2)

一、Z(zombie)-僵尸进程 1.僵尸进程概念 故事 张三每天都有跑步的习惯&#xff0c;这一天他和往常一样跑步&#xff0c;跑了两三圈&#xff0c;突然跑在它前面的一个人倒在地上不动了&#xff0c;作为热心市民张三赶紧报警并且拨打120。很快120就来了&#xff0c;但是没过几分…