美团2024届秋招笔试第一场编程真题(js版本)

1.小美的外卖订单

        简单的加法逻辑,需要注意的是各个数据的边界问题

  1. 折扣价不能超过原价
  2. 减的价格不能超过满的价格
  3. 满减优惠仅限原价购入
const rl = require("readline").createInterface({ input: process.stdin });
void (async function () {
    let count = 0;
    let list = [];
    let man = 0,jian = 0;

    rl.on("line", function (line) {
        if (count === 0) {
            count = parseInt(line);
        } else if (list.length < count) {
            const item = line.split(" ");
            list.push([parseFloat(item[0]), parseFloat(item[1])]);
        } else {
            const item = line.split(" ");
            man = parseFloat(item[0]);
            jian = parseFloat(item[1]);

            console.log(getPrices(list, man, jian));
        }
    });
})();
  
function getPrices(list, man, jian) {
    if(jian > man || man <= 0 || jian <= 0) return 'error'
    let prices1 = 0,
        prices2 = 0;
    for (let i = 0; i < list.length; i++) {
        if (list[i][1] > list[i][0] || list[i][1] <= 0 || list[i][0] <= 0) return "error";
        prices1 += list[i][0];
        prices2 += list[i][1];
    }
    if (prices1 >= man) {
        prices1 -= jian;
    }
    return prices1 > prices2 ? prices2.toFixed(2) : prices1.toFixed(2);
}

2.小美的字符串匹配度

  1. 第一步计算s和t中不操作的匹配度,也就是s[i] === t[i] 的个数
  2. 第二步,计算对t操作一次能增加的匹配的
const rl = require("readline").createInterface({ input: process.stdin });
 
void async function () {
    let length = 0;
    let s = '',t = '';
    // Write your code here
   rl.on('line',function(line){
    if(length === 0) {
        length = parseInt(line)
    } else if(s === '') {
        s = line;
    } else {
        t = line;
        console.log(computed(s,t))
    }
   })
}()
function computed(s, t) {
    //计算原本的匹配度
    let baseCount = 0;
    //记录无需交换操作的下标
    let used = new Array(s.length).fill(false);
    for (let i = 0; i < s.length; i++) {
        if (s[i] == t[i]) {
            used[i] = true;
            baseCount++;
        }
    }
    //计算操作一次增加的匹配度  1 or 2
    let changeCount = 0;
    for (let i = 1; i < t.length; i++) {
        //原本就匹配的,无需交换
        if (used[i]) continue;
        for (let j = i + 1; j < s.length; j++) {
            //原本就匹配的,无需交换
            if (used[j]) continue;
            // 满足交换后一个相等 继续执行
            // 满足两个相等,直接返回,操作一次最多怎加两个pipeidu
            if (t[i] === s[j]) {
                changeCount = 1;
                if (t[j] === s[i]) {
                    return baseCount + 2;
                }
            }
        }
    }
    return baseCount + changeCount;
}

3.小美的树上染色

贪心算法: 最优解就是从每条路径的叶子节点开始染红

const rl = require("readline").createInterface({ input: process.stdin });
let nodeValue = [];
let edgeMap = new Map()
void async function () {
    let start = 0;
    let nodeCount = 0;
    rl.on('line',function(line) {
        if(nodeCount === 0) {
            nodeCount = parseInt(line);
        } else if(nodeValue.length === 0) {
            nodeValue = line.split(' ').map(_ => parseInt(_))
        } else {
            start++;
            const item = line.split(' ')
            edgeMap.set(item[0],[...(edgeMap.get(item[0]) || []),item[1]])
            if(start == nodeCount - 1) {
                let hasVisited = []
                dfs('1',hasVisited);
                console.log(hasVisited.length)
            }
        }
    })
}()

function dfs(u,hasVisited) {
    //循环可到达
    if(edgeMap.has(u)) {
        for(let x of edgeMap.get(u)) {
            dfs(x,hasVisited);//遍历到每条线的末尾,叶子节点
            if(
                Math.sqrt(nodeValue[x-1] * nodeValue[u - 1]) % 1 === 0 
                && 
                !hasVisited.includes(x) && !hasVisited.includes(u)
            ) {
                hasVisited.push(x);
                hasVisited.push(u);
            }
        }
    }
}

4.小美的排列询问

简单无脑过: 找到x的位置,如果在x前后找到y就是yes

const rl = require("readline").createInterface({ input: process.stdin });

void (async function () {
    let nodeCount = 0;
    let list = [];
    let x = null,
        y = null;

    rl.on("line", function (line) {
        if (nodeCount === 0) {
            nodeCount = parseInt(line);
        } else if (list.length === 0) {
            list = line.split(" ");
        } else {
            [x, y] = line.split(" ");
            let flag = "No";
            for (let i = 0; i < nodeCount - 1; i++) {
                if (
                    (list[i] == x && list[i + 1] == y) ||
                    (list[i] == y && list[i + 1] == x)
                ) {
                    flag = "Yes";
                    break;
                }
            }
            console.log(flag);
        }
    });
})();

5.小美的排列构造

要让相邻两项的和的差值最小,排列需要满足第一大挨着第一小,第二大挨着第二小。例如n=6,满足要求的排列可以是[6,1,5,2,4,3],也可以是[1,6,2,5,3,4],权值都是0

题外话: n为偶数,权值为0,n为奇数,权值为 Math.ceil(n / 2)

const rl = require("readline").createInterface({ input: process.stdin });

void (async function () {
    let count = 0;
    rl.on("line", function (line) {
        if (count === 0) {
            count = parseInt(line);

            let list = "";
            let i = 1,
                j = count;
            while (i < j) {
                list = list + i + " " + j + " ";
                j--;
                i++;
            }
            if (count % 2 === 1) {
                list += j;
            }
            console.log(list.trimEnd());
        }
    });
})();

6.小美走公路

公路是环形的,可以顺时针走,也可以逆时针走,要求最短距离。

设x到y的直线距离是distanceA,从任意点顺时针走一圈的距离是distanceB, distanceB-distanceA代表x到y的绕圈距离,答案就是distanceA和distanceB-distanceA的最小值

const rl = require("readline").createInterface({ input: process.stdin });

void (async function () {
    let stationCount = 0;
    let distance = [];
    let start = 0,
        end = 0;
    rl.on("line", function (line) {
        if (stationCount === 0) {
            stationCount = parseInt(line);
        } else if (distance.length === 0) {
            distance = line.split(" ").map((_) => parseInt(_));
        } else {
            [start, end] = line.split(" ").map((_) => parseInt(_));
            console.log(getDistance(distance, start, end));
        }
    });
})();

function getDistance(distance, start, end) {
    //跑一圈 a点到a点
    const oneCircle = distance.reduce((total, cur) => total + cur, 0);
    //记录距离
    let total = 0;
    if (start > end) {
        //直线距离
        [start, end] = [end, start];
    }

    for (let i = start; i < end; i++) {
        total += distance[i - 1];
    }
    //直线距离 ? 还是绕一圈 ?
    return Math.min(total, oneCircle - total);
}

7.小美的好矩阵

直接遍历矩阵,然后判定

const rl = require("readline").createInterface({ input: process.stdin });

void (async function () {
    let n = 0,
        m = 0;
    let matrix = [];
    rl.on("line", function (line) {
        if (n == 0) {
            const item = line.split(" ");
            n = parseInt(item[0]);
            m = parseInt(item[1]);
        } else {
            matrix.push(line.split(""));
            if (matrix.length === n) {
                console.log(getButyNum(matrix, n, m));
            }
        }
    });
})();
function getButyNum(matrix, n, m) {
    let count = 0;
    if (n < 3 || m < 3) return count;

    for (let i = 0; i <= n - 3; i++) {
        for (let j = 0; j <= m - 3; j++) {
            if (isButy(matrix, i, j)) {
                count++;
            }
        }
    }
    return count;
}
function isButy(matrix, p, q) {
    let a = false,
        b = false,
        c = false;
    for (let i = p; i < p + 3; i++) {
        for (let j = q; j < q + 3; j++) {
            if (matrix[i][j] === "A") {
                a = true;
            } else if (matrix[i][j] === "B") {
                b = true;
            } else if (matrix[i][j] === "C") {
                c = true;
            } else {
                return false;
            }

            if (i - 1 >= p && matrix[i][j] === matrix[i - 1][j]) {
                return false;
            }
            if (i + 1 < p + 3 && matrix[i][j] === matrix[i + 1][j]) {
                return false;
            }
            if (j - 1 >= q && matrix[i][j] === matrix[i][j - 1]) {
                return false;
            }
            if (j + 1 < q + 3 && matrix[i][j] === matrix[i][j + 1]) {
                return false;
            }
        }
    }
    return a && b && c;
}

8.小美的蛋糕切割

由于不能把某个小正方形切成两个区域,所有的切法就是n-1种沿着行切开和m-1种沿着列切开,分别计算n+m-2种美味度的差值,取最小值

const rl = require("readline").createInterface({ input: process.stdin });

void async function () {
    let n = 0,m = 0;
    let matrix = [];
    rl.on('line',function(line) {
        if(n == 0) {
            const item = line.split(" ")
            n = parseInt(item[0])
            m = parseInt(item[1])
        } else {
            matrix.push(line.split(" "));
            if(matrix.length === n) {
                console.log(getMiniDiff(matrix, n, m));
            }
        }
    })
}()
function getMiniDiff(matrix, n, m) {
    //分别计算每行每列美味值,以及整个蛋糕的美味值
    let rows = new Array(n).fill(0);
    let columns = new Array(m).fill(0);
    let total = 0;
    for(let i=0;i<n;i++) {
        for(let j=0;j<m;j++) {
            const value = parseInt( matrix[i][j])
            rows[i] += value
            columns[j] += value
            total += value
        }
    }
    let diff = total;
    //查询按照行切割,美味差值
    let sum = 0;
    for(let i=0;i<rows.length;i++) {
        sum += rows[i];
        diff = Math.min(diff,Math.abs(2*sum - total))
    }
    //查询按照列切割,美味差值
    sum = 0;
    for(let j=0;j<columns.length;j++) {
        sum+=columns[j];
        diff = Math.min(diff,Math.abs(2*sum - total))
    }
    //
    return diff
}

9.小美的字符串变换

先暴力算出满足要求的矩阵的x,y组合,再挨个计算出每种矩阵的连通块数量(深度遍历dfs),取最小值

const rl = require("readline").createInterface({ input: process.stdin });

void (async function () {
    let count = 0;
    rl.on("line", function (line) {
        if (count === 0) {
            count = parseInt(line);
        } else {
            console.log(getBlocks(count, line));
        }
    });
})();
function getBlocks(count, str) {
    //计算可能x y组合
    let group = [];
    for (let i = 1; i <= count; i++) {
        for (let j = 1; j <= count; j++) {
            if (i * j == count) {
                group.push([i, j]);
            }
        }
    }
    //分别计算矩阵
    let result = str.length;
    for (let k = 0; k < group.length; k++) {
        const x = group[k][0];
        const y = group[k][1];
        let temp = 0;//记录当前矩阵连通块数量
        let list = str.split("");
        for (let i = 0; i < x; i++) {
            for (let j = 0; j < y; j++) {
                if (list[i * y + j] !== "0") {
                    temp++;
                    dfs(x, y, list, i, j, list[i * y + j]);
                }
            }
        }
        result = Math.min(result, temp);
    }
    return result;
}
function dfs(x, y, list, i, j, flag) {
    //判定i,j合法性
    if (!(i >= 0 && i < x && j >= 0 && j < y)) {
        return;
    }
    //不和参考相等就退出
    if (list[i * y + j] != flag) {
        return;
    }
    //当前重置为0,再向上下左右拓展
    list[i * y + j] = "0";
    dfs(x, y, list, i - 1, j, flag);
    dfs(x, y, list, i + 1, j, flag);
    dfs(x, y, list, i, j - 1, flag);
    dfs(x, y, list, i, j + 1, flag);
}

总结: 稍微难一点的是3题和9题,需要对【贪心算法+图+深度优先算法】有一些了解,其余的都是考验基本编程能力和动点小脑筋的题目(考察透过题目直击根本逻辑的能力)。

不足:虽然都做出来了,但是耗时太长。大概是有做题恐惧症>.< ,一想到自己在做题,脑袋就不能思考了,一旦停止考试,脑袋就工作正常了。害,还是经历的少了,多做几套大概就好了。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

JavaScript保留字和预定义的全局变量及函数汇总

保留字也称关键字&#xff0c;每种语言中都有该语言本身规定的一些关键字&#xff0c;这些关键字都是该语言的语法实现基础&#xff0c;JavaScript中规定了一些标识符作为现行版本的关键字或者将来版本中可能会用到的关键字&#xff0c;所以当我们定义标识符时就不能使用这些关…

典型场景解析|PolarDB分布式版如何支撑SaaS多租户?

SaaS多租户背景 很多平台类应用或系统&#xff08;如电商CRM平台、仓库订单平台等等&#xff09;&#xff0c;它们的服务模型是围绕用户维度&#xff08;这里的用户维度可以是一个卖家或品牌&#xff0c;可以是一个仓库等&#xff09;展开的。因此&#xff0c;这类型的平台业务…

文件上传漏洞(全网最详细)

目录 前言 文件上传漏洞介绍 文件上传漏洞危害 文件上传漏洞满足条件 文件检测流程 CTFSHOW 151关-170关 151关&#xff1a;前端验证绕过 152关&#xff1a;后端校验 Content-Type 校验文件格式 153关&#xff1a;filename字段文件后缀校验 154关&#xff1a;关键字过…

18_类加载

文章目录 类加载器类加载时机Java代码的3个阶段 反射关于Class配置文件(.properties)Properties类通过反射获取构造方法(Constructor)通过反射获取成员变量(Field)通过反射获取成员方法(Method) 其他API自定义类加载器反射的应用 类加载器 分类&#xff1a; Bootstrap ClassLo…

Visual Studio中项目添加链接文件

这个需求在VS里面使用还真不多见&#xff0c;只是最近在做项目的版本编号的时候遇到一个头大的问题&#xff0c;我一个解决方案下面有几十个类库&#xff0c;再发布的时候这几十个类库的版本号必须要统一&#xff0c;之前我们都是在单个的AssemblyInfo.cs里面去改相关的信息&am…

轻量级图床Imagewheel本地部署并结合内网穿透实现远程访问

文章目录 1.前言2. Imagewheel网站搭建2.1. Imagewheel下载和安装2.2. Imagewheel网页测试2.3.cpolar的安装和注册 3.本地网页发布3.1.Cpolar临时数据隧道3.2.Cpolar稳定隧道&#xff08;云端设置&#xff09;3.3.Cpolar稳定隧道&#xff08;本地设置&#xff09; 4.公网访问测…

Echarts的常用API,以及常用的写法

ECharts是一款基于JavaScript的开源可视化库&#xff0c;用于构建交互式的图表和可视化数据。它提供了丰富的API用于定制图表和处理数据。下面是一些常用的ECharts API和写法的简介&#xff1a; 初始化图表容器&#xff1a; var myChart echarts.init(document.getElementBy…

win11更改桌面默认存储路径

打开文件资源管理器 右击桌面点击属性 在属性中找到位置选项卡&#xff0c;在里面有一个移动&#xff0c;点击它选择你想要的位置 选好位置后点击应用&#xff0c;随后会出现一个进度条&#xff0c;跑完后点击确认 到这里就完成了桌面默认位置的转移

在windows11系统上利用docker搭建linux记录

我的windows11系统上&#xff0c;之前已经安装好了window版本的docker&#xff0c;没有安装的小伙伴需要去安装一下。 下面直接记录安装linux的步骤&#xff1a; 一、创建linux容器 1、拉取镜像 docker pull ubuntu 2、查看镜像 docker images 3、创建容器 docker run --…

2024 年 1 月安全更新修补了 58 个漏洞(Android )

谷歌发布了针对 Android 平台 58 个漏洞的补丁&#xff0c;并修复了 Pixel 设备中的 3 个安全漏洞&#xff0c;拉开了 2024 年的序幕。 Android 2024 年 1 月更新的第一部分以 2024 年 1 月 1 日安全补丁级别发布在设备上&#xff0c;解决了框架和系统组件中的 10 个安全漏洞&…

高级分布式系统-第6讲 分布式系统的容错性--故障/错误/失效/异常

分布式系统容错性的概念 分布式系统的容错性&#xff1a; 当发生故障时&#xff0c; 分布式系统应当在进行恢复的同时继续以可接受的方式进行操作&#xff0c; 并且可以从部分失效中自动恢复&#xff0c; 且不会严重影响整体性能。 具体包括以下4个方面的内容&#xff1a; 可…

redis — redis cluster集群模式下如何实现批量可重入锁?

一、redis cluster 集群版 在Redis 3.0版本以后,Redis发布了Redis Cluster。该集群主要支持搞并发和海量数据处理等优势,当 Redis 在集群模式下运行时,它处理数据存储的方式与作为单个实例运行时不同。这是因为它应该准备好跨多个节点分发数据,从而实现水平可扩展性。具体能…

【科研技巧】如何判断某个期刊是什么类别及影响因子?是否是顶会?如何期刊内检索?AI写综述?AI做PPT?

相关链接 查找和免费下载文献的方式汇总国内外各大期刊关系、如何查看期刊等级以及查看某篇论文属于哪个期刊登录和访问EI(Engineering Village)数据库查找文献 1 如何判断某个期刊是什么类别及影响因子 https://sci.justscience.cn/ IFold是影响因子 期刊类别为SCIE、查看…

在线ai扩图是什么?有什么工具?分享3个好用的工具。

在线ai扩图是什么&#xff1f;有什么工具&#xff1f;分享3个好用的工具。 在当今数字化的时代&#xff0c;图像处理成为了我们日常生活和工作中不可或缺的一部分。有时候&#xff0c;我们需要将图像放大以获取更多的细节&#xff0c;但传统的方法往往会导致图像质量的损失。幸…

Nginx服务配置文件

在Nginx服务器的主配置文件/usr/local/nginx/conf/nginx.conf 中&#xff0c;包括全局配置、I/O事件配置 和HTTP配置这三大块内容&#xff0c;配置语句的格式为“关键字 值&#xff1a;”&#xff08;末尾以分号表示结束&#xff09;&#xff0c;以“#” 开始的部分表示注释。 …

小手也能用的高性能鼠标,自定义空间还挺高,雷柏VT9Pro mini上手

今年搭载PAW3395传感器的电竞鼠标很受欢迎&#xff0c;雷柏就出了不少型号&#xff0c;满足各种喜好的玩家选择&#xff0c;像是近期新出的搭载3395高定版的VT9Pro和VT9Pro mini&#xff0c;就在轻量化的基础上&#xff0c;满足了各种手型的玩家的使用需要&#xff0c;而且价格…

2024年美妆品牌如何突破营销困境,强势突围?

随着人们消费观念的升级&#xff0c;美妆护肤几乎成为人们的日常标配&#xff0c;不仅仅女性还有男性也开始注重管理&#xff0c;美妆产品的目标消费群体在不断扩大&#xff0c;对产品的要求也逐渐多元化&#xff0c;在这一趋势下&#xff0c;2024年美妆品牌怎么做才能突破营销…

《MCtalk·CEO对话》正式上线!首期对话高成资本

2015 年 10 月&#xff0c;网易智企发布第一款产品&#xff0c;正式踏上了 ToB 商业化之路。从那以后&#xff0c;我们每年举办不同主题的科技峰会&#xff0c;分享最新的行业体感和洞察&#xff1b;访谈各界企业领导者&#xff0c;记录他们的创新与创业经历&#xff1b;走过大…

从车联网到智慧城市:智慧交通的革新之路

一、引言 1、智慧城市的概念和发展背景 智慧城市&#xff08;Smart City&#xff09;是指以信息技术为基础&#xff0c;运用信息与通信等手段&#xff0c;对城市各个核心系统各项关键数据进行感测、分析、整合和利用&#xff0c;实现对城市生活环境的感知、资源的调控&#x…

web3d-three.js场景设计器-sprite广告牌

three.js使用Sprite精灵实现文字或者图片广告牌1.将文字绘制到Canvas&#xff0c;调整对应宽高。2.作为Cavans材质绑定到Sprite3.加载到场景调整适当的scale function createLabel({ text, fontSize, textColor, color, imageUrl }) { return new Promise((resolve, reject) &…