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

news2024/11/17 19:52:07

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题,需要对【贪心算法+图+深度优先算法】有一些了解,其余的都是考验基本编程能力和动点小脑筋的题目(考察透过题目直击根本逻辑的能力)。

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

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

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

相关文章

NVIDIA深入理解之pynvml库

一、前言 写在前面 该文章是对我之前文章《Fedora上安装NVIDIA闭源显卡驱动》的一个拓展&#xff0c;正好寒假闲的没事干不如加深一下对NVIDIA的了解。Python是当前非常流行的一门编程语言&#xff0c;它以kiss为设计思想&#xff0c;能封装就能封装&#xff0c;给用户提供比…

Java封装了一个自适应的单位转换工具类

目录 前言 1、前期准备 2、实现代码 2.1 方法一&#xff1a;通过map去标记需要转换的 类属性字段 2.2 方法二&#xff1a;配合自定义注解 前言 平时在做项目中&#xff0c;经常会做一些数据书籍&#xff0c;尤其像是数据看板之类&#xff0c;需要从数据库中查询想要的数据…

这是一家有图书馆的公司

Tubi 技术团队的同事们&#xff0c;除了爱写书、翻译书&#xff0c;也很爱读书。应广大爱书人号召&#xff0c;Tubi 中国团队从 2018 年 7 月开始兴建 Tubi 小书架&#xff0c;迄今已建成了一个有着17 种类别、近 500 本藏书、100 位常驻借阅成员、以音视频开发、广告推荐和团队…

固态继电器SSR光耦OR-806A ,对标替代AQW212

固态继电器 VL60V输出端击穿电压光耦 高隔离电压 60 至 600V 输出耐受电压 工业温度范围&#xff1a;-40 to 85℃ 高灵敏度和高速响应 特征 输入和输出之间的高隔离电压 &#xff08;Viso&#xff1a;5000 V rms&#xff09;。 控制低电平模拟信号 高灵敏度和高速响应 …

Neo4j备份

这里主要讲Neo4j在windows环境下如何备份&#xff0c;Linux环境同理 Neo4j恢复看这里:Neo4j恢复-CSDN博客 Step1:停服 关闭neo4j.bat console会话窗口即可 Step2: 备份 找到数据目录&#xff0c;并备份、压缩 copy即可 data - 20240108.7z Step3: 启动服务 进入命令行&am…

【动态规划】20子数组系列_环形子数组的最大和_C++(medium)

题目链接&#xff1a;leetcode环形子数组的最大和 目录 题目解析&#xff1a; 算法原理 1.状态表示 2.状态转移方程 3.初始化 4.填表顺序 5.返回值 编写代码 题目解析&#xff1a; 题目让我们求返回 nums 的非空 子数组 的最大可能和 这道题如果是按照-这道题-是不对…

MySQL数据被误删怎么办?

文章目录 前言数据备份恢复工具数据备份策略数据备份恢复演示备份数据模拟数据误删恢复备份的数据恢复未备份的数据 总结 前言 很多年前&#xff0c;被公司外派到一家单位驻场开发一个OA项目&#xff0c;两个开发对接各部门的需求&#xff0c;需求还要及时生效&#xff08;一边…

usb转i2c无需代码实现

总体思路 usb 转 ttl ttl转i2c 因此可以使用普通的串口调试助手进行。 同时也避免了自己写程序的麻烦。 关键芯片 参考资料 SC18IM700_4_20191009.fm (szlcsc.com)https://atta.szlcsc.com/upload/public/pdf/source/20221014/7E6E1261944FE14AC40A431139B6E16B.pdf …

C++(9)——内存管理

1. 内存分类&#xff1a; 在前面的文章中&#xff0c;通常会涉及到几个名词&#xff0c;例如&#xff1a;栈、堆。这两个词所代表的便是计算机内存的一部分 。在计算机中&#xff0c;对系统的内存按照不同的使用需求进行了区分&#xff0c;大致可以分为&#xff1a;栈 、堆、数…

平均预期寿命可视化

完整地址&#xff1a; 一键三连感谢您的观看 https://www.bilibili.com/video/BV11V41197Rd/?spm_id_from333.999.list.card_archive.click&vd_sourcee9167c654bb4523338a765358a8ac2af<!DOCTYPE html> <html><head><meta charset"utf-8"…

工程师职称申报业绩是如何要求的?

无论是初级职称还是中级职称或是高级职称&#xff0c;评审的重要条件之一就是相关的业绩证明。 一、个人业绩&#xff0c;比如你做过哪些与本专业相关的业绩证明&#xff0c;像工程类的职称&#xff0c;你的业绩证明就包括中标通知书、竣工验收报告&#xff0c;或是你参与工程建…

脑科学与人工神经网络ANN的发展历程与最新研究

本文深入研究了ANN的基本概念、发展背景、应用场景以及与人脑神经网络的关系。 关注TechLead&#xff0c;分享AI全维度知识。作者拥有10年互联网服务架构、AI产品研发经验、团队管理经验&#xff0c;同济本复旦硕&#xff0c;复旦机器人智能实验室成员&#xff0c;阿里云认证的…

【书生·浦语大模型实战营04】《(4)XTuner 大模型单卡低成本微调实战》学习笔记

《(4)XTuner 大模型单卡低成本微调实战》 课程文档&#xff1a;《XTuner 大模型单卡低成本微调实战》 1 Finetune简介 LLM的下游应用中&#xff0c;增量预训练和指令跟随是经常会用到两种的微调模式 1.1 增量预训练微调 使用场景&#xff1a;让基座模型学习到一些新知识&a…

中本聪15年前剧本重演!“比特币上市首日”成绩斐然,ETF交易量冲破46亿美元!

2024年1月11日&#xff0c;美国证券交易委员会&#xff08;SEC&#xff09;以3-2投票结果批准比特币现货ETF。 2009年1月11日&#xff0c;中本聪向比特币早期开发者哈尔芬尼(Hal Finney)转出10枚比特币&#xff0c;使他成为世界上第一个透过交易获得比特币的人。随后&#xff0…

13个自媒体文库平台(附通道链接)

​划到最后“阅读原文” ——进入官网 Hi&#xff0c;大家好&#xff0c;我是胡猛夫&#xff0c;每天分享实用运营工具&#xff01; 更多内容&#xff0c;更多资源&#xff0c;欢迎交流&#xff01; 公 号 | 微视角文化 》》精彩推荐 >>微视角文化知识库&#xff1a;移…

智汇云舟受邀出席石油化工工程数字化交付研讨会

1月9日&#xff0c;由中国石油和石化工程研究会主办的石油化工工程数字化交付研讨会暨智能化工厂建设运行经验交流会在北京顺利召开。智汇云舟创始人兼总裁周舟受邀出席活动&#xff0c;与来自中国石油、中国石化、中国海油、中国中化等单位的相关专家、领导三百余人共同探讨如…

轻量级图床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.公网访问测…

最佳实践:如何在 SoapUI 中进行 REST 服务的测试

SoapUI 频繁地被选择为 SOAP 和 REST API 的自动化测试利器&#xff0c;得益于其友好的用户界面&#xff0c;测试人员毫不费力便可校验 REST 和 SOAP 协议的 Web 服务。它尤其适用于那些需要进行复杂测试的场合。 1、设置接口 我利用了 Swagger 去设置了一批即将投入使用的接…

springcloud stream消息驱动

简介 Spring Cloud Stream是一个用于构建基于事件驱动的微服务应用程序的框架&#xff0c;其核心目标是简化开发过程&#xff0c;降低消息通信的复杂性&#xff0c;从而使开发人员能够专注于编写业务逻辑。Spring Cloud Stream通过提供Binder抽象&#xff0c;将应用程序与消息…

基于Java SSM框架实现医院管理系统项目【项目源码】计算机毕业设计

基于java的SSM框架实现医院管理系统演示 SSM框架 当今流行的“SSM组合框架”是Spring SpringMVC MyBatis的缩写&#xff0c;受到很多的追捧&#xff0c;“组合SSM框架”是强强联手、各司其职、协调互补的团队精神。web项目的框架&#xff0c;通常更简单的数据源。Spring属于…