模拟笔试 - 卡码网周赛第二十一期(23年美团笔试真题)

news2025/1/13 13:30:47

第一题:小美的排列询问 

 

解题思路:
简单题,一次遍历数组,判断  是否有和x、y相等并且相连  即可。

可优化逻辑:因为x和y是后输入的,必须存储整个数组,但是上面说了 **排列是指一个长度为n的数组,其中 1 到 n 每个元素恰好出现一次。**可以充分利用该信息创建一个大小为n+1的数组存储各个元素的所在位置,这样最终直接判断x和y所在位置差是否为1即可判断结果。、

解法一 :哈希表(比较灵活运用哈希表)
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        //int[] arr = new int[n];
        //map 记录每个元素所在的位置
        int[] map = new int[n+1];
        for (int i = 0; i < n; i++) {
            int ai = scanner.nextInt();
            map[ai] = i;
        }
        int x = scanner.nextInt();
        int y = scanner.nextInt();

        if(Math.abs(map[x]-map[y])==1){
            System.out.println("Yes");
            return;
        }
        System.out.println("No");
    }
}

Math.abs 是 Java 中 java.lang.Math 类的一个静态方法,用于返回一个数的绝对值。绝对值指的是一个数在数轴上距离原点的距离,因此它始终是非负数。这个方法有多个重载版本,可以处理不同的数据类型,包括 intlongfloat 和 double

 时空复杂度

时间复杂度 :O(n)。一次遍历数组。

空间复杂度 :O(``n``)。哈希表所占空间

解法二:直接模拟(简单粗暴,易想到的方法)
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int[] arr = new int[n];
        for (int i = 0; i < n; i++) {
            arr[i] = scanner.nextInt();
        }
        int x = scanner.nextInt();
        int y = scanner.nextInt();

        //遍历数组arr,只有x在前,y在后,或者x在后,y在前的情况满足题意,属于Yes
        for (int i = 0; i < n - 1; i++) {
            if ((arr[i] == x && arr[i + 1] == y) || (arr[i] == y && arr[i + 1] == x)) {
                System.out.println("Yes");
                return;
            }
        }
        System.out.println("No");
    }
}

第二题:小美走公路

解题思路

注意,本题和LeetCode1184.公交站间的距离完全一致。

题目要求计算最短距离,实际上一共只有两条可能的路径:顺时针从x走到y和逆时针从x走到y

因此只需要计算顺时针和逆时针的两个结果进行比较即可。

唯一需要注意的地方就是边界,即第n站到第1站的距离的计算,这里可以通过 逻辑判断 是否到达边界,也可以通过 取余的方式避免边界问题

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt(); // 读取站的数量
        int[] distances = new int[n]; // 存储各站之间的距离
        for (int i = 0; i < n; i++) {
            distances[i] = scanner.nextInt(); // 读取各站之间的距离
        }
        int x = scanner.nextInt(); // 读取出发站
        int y = scanner.nextInt(); // 读取目的站

        int clockwiseDistance = 0; // 顺时针方向的距离
        int counterClockwiseDistance = 0; // 逆时针方向的距离

        // 计算顺时针距离
        // 从出发站到目的站,顺时针方向逐个累加距离
        for (int i = x - 1; i != y - 1; i = (i + 1) % n) {
            clockwiseDistance += distances[i];
        }

        // 计算逆时针距离
        // 从目的站到出发站,逆时针方向逐个累加距离
        for (int i = y - 1; i != x - 1; i = (i + 1) % n) {
            counterClockwiseDistance += distances[i];
        }

        // 输出顺时针和逆时针两种情况下的最短距离
        System.out.println(Math.min(clockwiseDistance, counterClockwiseDistance));
    }
}

 (i + 1) % n : 是一种常见的操作,用于在循环列表(或环形缓冲区、圆形队列)中循环递增索引。这个操作确保了当索引增加到列表的末尾时,它会自动回到开头,从而实现环形访问。这里是详细解释:

  • i:当前的索引。
  • i + 1:下一个索引。
  • % n:取模运算符,n 是列表的长度。

作用

当 i 增加时,(i + 1) 可能会超过数组的最大索引(即 n-1)。为了使索引在超出数组边界时回到起点(形成一个环),使用了取模操作 % n

例如:

  • 当 i 为 0 到 n-2 时,(i + 1) % n 简单地返回 i + 1
  • 当 i 为 n-1(即最后一个元素的索引)时,(i + 1) % n 返回 0,这样就回到了数组的开头。

为了防止顺时针 x到y遇到边界(y在x前时有可能)或者y逆时针走,一定会遇到边界。都需要处理。

 如果用逻辑判断的方法:

这个代码使用逻辑判断来处理数组索引超出边界的情况,使得索引在到达数组边界时正确循环。这样,可以计算两个站之间的最短距离。

// 将站的编号转换为数组的索引(转化为从索引x 到 索引 y) -- 这么操作更方便理解

        int x = scanner.nextInt(); // 读取出发站的编号(假设从1开始)
        int y = scanner.nextInt(); // 读取目的站的编号(假设从1开始)

        // 将站的编号转换为数组的索引(转化为从索引x 到 索引 y)
        x = x - 1;
        y = y - 1;

        int clockwiseDistance = 0; // 初始化顺时针方向的距离
        int counterClockwiseDistance = 0; // 初始化逆时针方向的距离

        // 计算顺时针距离
        // 从出发站开始,按顺时针方向逐个累加距离,
        // 直到到达目的站。通过判断 i == n 确保索引在数组末尾时回到开头。
        int i = x;
        while (i != y) {
            clockwiseDistance += distances[i];
            i++;
            if (i == n) {
                i = 0; // 超出数组末尾,回到开头
            }
        }

        // 计算逆时针距离
        // 从目的站开始,按逆时针方向逐个累加距离,直到回到出发站。
        // 通过判断 i == -1 确保索引在数组开头时回到末尾。
        i = y;
        while (i != x) {
            i--;
            if (i == -1) {
                i = n - 1; // 超出数组开头,回到末尾
            }
            counterClockwiseDistance += distances[i];
        }

力扣解法 :更秒,直接 交换起始地和目的地的位置,再计算相关索引的距离值的和,再比较 

class Solution {
    public int distanceBetweenBusStops(int[] distance, int start, int destination) {
        // 如果start 在 des后面,交换二者
        if (start > destination) {
            int temp = start;
            start = destination;
            destination = temp;
        }
    
        int sum1 = 0, sum2 = 0;
    
        // 遍历整个distance数组
        for (int i = 0; i < distance.length; i++) {
            // 计算从start到destination的总距离
            if (i >= start && i < destination) { //顺时针总距离
                sum1 += distance[i];
            } else { //i < start && i >= destination 逆时针总距离
                // 计算从destination到start的总距离
                sum2 += distance[i];
            }
        }
    
        // 返回从start到destination和从destination到start的距离中较小的值
        return Math.min(sum1, sum2);
    }
}

 第三题:小美的蛋糕切割

第四题:小美的字符串变换

解题思路

这个问题的需求其实是很明确的,根据题意我们需要做两件事

  • 找到所有可以摆列的方式,需要满足x*y=n,假设其中x为小的,那么可以枚举1到k(k*k=n,不需要枚举到n),找到所有的枚举方式
  • 每一个具体的枚举,通过DFS或者BFS的方式,找到其中的联通块数量。具体实现上标记每个位置是否访问,然后从一个方块如果未访问,那么联通块+1然后向四周搜索拓展、标记。
 解法一:DFS
import java.util.*;

public class Main {
    // 方法用于计算最小权值,输入为整数n和字符串s
    public static int minWeight(int n, String s) {
        int minW = Integer.MAX_VALUE; // 初始化最小权值为最大整数值
        
        // 遍历所有可能的矩阵大小,找到所有满足x*y=n的x和y
        for (int i = 1; i * i <= n; i++) {
            if (n % i == 0) {
                int x = i;
                int y = n / i;
                
                // 构建矩阵 (情况1: x为行数,y为列数)
                char[][] matrix = new char[x][y];
                for (int j = 0; j < x; j++) {
                    for (int k = 0; k < y; k++) {
                        matrix[j][k] = s.charAt(j * y + k); // 将字符串s的字符填入矩阵
                    }
                }
                
                // 计算矩阵的权值并更新最小权值
                minW = Math.min(minW, countConnected(matrix));
                
                // 情况2: 交换x和y的位置
                x = n / i;
                y = i;
                
                // 构建矩阵
                matrix = new char[x][y];
                for (int j = 0; j < x; j++) {
                    for (int k = 0; k < y; k++) {
                        matrix[j][k] = s.charAt(j * y + k); // 将字符串s的字符填入矩阵
                    }
                }
                
                // 计算矩阵的权值并更新最小权值
                minW = Math.min(minW, countConnected(matrix));
            }
        }
        return minW; // 返回最小权值
    }

    // 计算矩阵的连通块数量
    public static int countConnected(char[][] matrix) {
        int count = 0; // 初始化连通块计数器
        boolean[][] visited = new boolean[matrix.length][matrix[0].length]; // 记录访问状态的数组
        int[][] directions = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}}; // 四个方向的移动向量

        // 遍历矩阵的每个元素
        for (int i = 0; i < matrix.length; i++) {
            for (int j = 0; j < matrix[0].length; j++) {
                // 如果该位置未被访问
                if (!visited[i][j]) {
                    count++; // 连通块计数加一
                    dfs(matrix, visited, directions, i, j); // 执行深度优先搜索
                }
            }
        }
        return count; // 返回连通块的数量
    }

    // 深度优先搜索连通块
    public static void dfs(char[][] matrix, boolean[][] visited, int[][] directions, int x, int y) {
        visited[x][y] = true; // 标记为已访问,避免重复计算
        // 遍历四个方向
        for (int[] direction : directions) {
            int nx = x + direction[0];
            int ny = y + direction[1];
            // 如果新位置在矩阵范围内且未被访问且与当前字符相同,则递归调用DFS
            if (nx >= 0 && nx < matrix.length && ny >= 0 && ny < matrix[0].length && !visited[nx][ny] && matrix[nx][ny] == matrix[x][y]) {
                dfs(matrix, visited, directions, nx, ny);
            }
        }
    }

    // 主方法
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in); // 创建Scanner对象以读取输入
        int n = scanner.nextInt(); // 读取整数n
        scanner.nextLine(); // 读取换行符
        String s = scanner.nextLine(); // 读取字符串s
        System.out.println(minWeight(n, s)); // 调用minWeight方法并输出结果
    }
}

第五题:小美的树上染色

 

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

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

相关文章

学习笔记——网络管理与运维——概述(网络管理)

二、概述 1、什么是网络管理&#xff1f; 网络管理是通过对网络中设备的管理&#xff0c;保证设备工作正常&#xff0c;使通信网络正常地运行&#xff0c;以提供高效、可靠和安全的通信服务&#xff0c;是通信网络生命周期中的重要一环。 2、网络管理分类 网络管理(Network …

C++ 24 之 拷贝构造函数

c24拷贝构造函数.cpp #define _CRT_SECURE_NO_WARNINGS #include <iostream> using namespace std;class Person3 { private:int p_age; public:// 构造函数分类&#xff1a;// 按参数分类&#xff1a;1、有参 2、无参// 按类型分类:普通、拷贝&#xff08;复制&…

Charles代理https接口到本地

一、操作手册 1、安装工具 1.1、安装代理软件Charles 软件下载地址&#xff1a;Download a Free Trial of Charles • Charles Web Debugging Proxy 1.2、安装https代理插件&#xff1a;&#xff08;有问题自行百度解决&#xff09; 2、配置策略 以下以https接口为例&…

型号设计师和指挥调度体系: 中国航天系统工程的组织方式

在中国航天&#xff0c;系统工程的组织管理体系是设计师系统和指挥调度系统。 型号设计师系统是型号的技术体系&#xff0c;总设计师是研制任务的技术总负责人&#xff0c;是设计技术方面的组织者、指挥者&#xff0c;重大技术问题的决策者。 指挥调度系统是型号行政管理系统…

C++switch陈述

C 使用关键字 switch、case、default对一个常数执行不同的分流&#xff0c;这构成多重选择的结构&#xff0c;形式如下 简单来说&#xff0c;switch后头接一小括弧&#xff0c;小括弧内为一常数运算式&#xff0c;计算出常数值若与其后case的位标(label) 相符&#xff0c;就会执…

文件没有权限问题:cannot create /opt/apollo/neo/data/log/monitor.log: Permission denied

问题描述 执行 aem bootstrap start --plus 命令启动 Dreamview 提示错误&#xff1a; /bin/sh: 1: cannot create /opt/apollo/neo/data/log/monitor.log: Permission denied [ERROR] Failed to start Dreamview. Please check /opt/apollo/neo/data/log/dreamview.log or /op…

Windows环境RocketMQ启动broker时启动失败

在输入”start mqbroker.cmd -n 127.0.0.1:9876 autoCreateTopicEnabletrue“命令启动失败后&#xff0c;会出现如下图所示的样子。 但我们重新启动电脑、重新启动RocketMQ或者杀死进程等方法都对此无效&#xff0c;还是没有启动成功。 启动失败的原因&#xff1a; 中途断网或…

Kaggle -- Multi-Class Prediction of Obesity Risk

使用简单的决策树进行分类&#xff0c;代码如下&#xff1a; import pandas as pd import numpy as np from sklearn.preprocessing import OneHotEncoder from sklearn.model_selection import train_test_splitdf pd.read_csv("train.csv")df[Gender] df[Gender…

React 中的 Lanes

React 中有一个 Lane 的概念&#xff0c;Lane 就像高速路上的不同车道&#xff0c;具有不同优先级&#xff0c;在 React Lane 通过一个 32 位的二进制数来表示。越小优先级别越高&#xff0c;SyncLane 级别最高。用二进制存储的方式&#xff0c;可以通过逻辑操作快速判断 Lane …

vite.config.js如何使用env的环境变量

了解下环境变量在vite中 官方文档走起 https://cn.vitejs.dev/guide/env-and-mode.html#env-variables-and-modes 你见到的.env,.env.production等就是放置环境变量的 官方文档说到.env.[mode] # 只在指定模式下加载,比如.env.development只在开发环境加载 至于为什么是deve…

算法课程笔记——线段树维护矩阵

算法课程笔记——线段树维护矩阵 2

【每日一练 】day2

✨✨谢谢大家捧场&#xff0c;祝屏幕前的小伙伴们每天都有好运相伴左右&#xff0c;一定要天天开心哦&#xff01;✨✨ &#x1f388;&#x1f388;作者主页&#xff1a; &#x1f388;丠丠64-CSDN博客&#x1f388; ✨✨ 帅哥美女们&#xff0c;我们共同加油&#xff01;一起…

代理IP常见问题解答,新手必看手册

代理IP在互联网数据收集和业务开展中发挥着重要作用&#xff0c;它充当用户客户端和网站服务器之间的“屏障”&#xff0c;可以保护用户的真实IP地址&#xff0c;并允许用户通过不同的IP地址进行操作。然而&#xff0c;在使用代理IP的过程中&#xff0c;用户经常会遇到一些问题…

2.spring cloud gateway 源码编译

spring cloud gateway编译 1.编译 命令 mvn clean compile -U2.报错 报错信息 核心信息 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-checkstyle-plugin:3.1.2:check (checkstyle-validation) on project spring-cloud-gateway-mvc: Failed during …

javaWeb项目-ssm+vue中国风音乐推介网站功能介绍

本项目源码&#xff1a;java-ssmvue中国风音乐推介网站源码说明文档资料资源-CSDN文库 项目关键技术 开发工具&#xff1a;IDEA 、Eclipse 编程语言: Java 数据库: MySQL5.7 框架&#xff1a;ssm、Springboot 前端&#xff1a;Vue、ElementUI 关键技术&#xff1a;springboot、…

setOptMode -holdTargetSlack与-holdSlackFixingThreshod

我正在「拾陆楼」和朋友们讨论有趣的话题&#xff0c;你⼀起来吧&#xff1f; 拾陆楼知识星球入口 -holdTargetSlack与-holdSlackFixingThreshod这两个option都是针对hold slack的&#xff0c;前者限制slack的目标&#xff0c;默认是0&#xff0c;也就是说工具尽可能会收敛时序…

vivado HW_SYSMON

描述 系统监视器HW_SYSMON是Xilinx上的一个模数转换器&#xff08;ADC&#xff09;电路 用于测量诸如温度和电压之类的操作条件的设备。这个 HW_SYSMON通过片上温度和电源监控物理环境 传感器。ADC为一系列应用提供了高精度模拟接口。这个 ADC最多可访问17个外部模拟输入通道。…

分类模型:MATLAB判别分析

1. 判别分析简介 判别分析&#xff08;Discriminant Analysis&#xff09; 是一种统计方法&#xff0c;用于在已知分类的样本中构建分类器&#xff0c;并根据特征变量对未知类别的样本进行分类。常见的判别分析方法包括线性判别分析&#xff08;Linear Discriminant Analysis, …

MySQL workbench:E-R 图与 mysql 脚本之间相互转换

我们都知道 MySql 是关系型数据库的开发语言&#xff0c;描述一个关系型数据库的方式有 E-R 图法。MySql workbench 是 MySql 社区版自带的免费工具。也是比较好用的图形界面客户端管理工具。支持正向及逆向工具。 MySql workbench 下载安装 官方下载地址&#xff1a;https://…

深度学习长文|使用 JAX 进行 AI 模型训练

引言 在人工智能模型的开发旅程中&#xff0c;选择正确的机器学习开发框架是一项至关重要的决策。历史上&#xff0c;众多库都曾竞相争夺“人工智能开发者首选框架”这一令人垂涎的称号。&#xff08;你是否还记得 Caffe 和 Theano&#xff1f;&#xff09;在过去的几年里&…