【高德地图笔试题汇总】2024-04-11-高德地图春招笔试题-三语言题解(CPP/Python/Java)

🍭 大家好这里是KK爱Coding ,一枚热爱算法的程序员

✨ 本系列打算持续跟新高德地图近期的春秋招笔试题汇总~

💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导

👏 感谢大家的订阅➕ 和 喜欢💗

📧 KK这边最近正在收集近一年互联网各厂的笔试题汇总,如果有需要的小伙伴可以关注后私信一下 KK领取,会在飞书进行同步的跟新。

文章目录

    • 🎧 01.K小姐的学习小组
      • 问题描述
      • 输入格式
      • 输出格式
      • 样例输入
      • 样例输出
      • 数据范围
      • 题解
      • 参考代码
    • 🎹 02.LYA 的跳跃游戏
      • 问题描述
      • 输入格式
      • 输出格式
      • 样例输入
      • 样例输出
      • 数据范围
      • 题解
      • 参考代码
    • 写在最后
    • 📧 KK这边最近正在收集近一年互联网各厂的笔试题汇总,如果有需要的小伙伴可以关注后私信一下 KK领取,会在飞书进行同步的跟新。

🎧 01.K小姐的学习小组

问题描述

K小姐是学校一名新来的计算机老师,为了提高班级里同学们的编程能力,她想到了一个非常好的方法:先让所有的同学手拉手围成一个圈,然后每名同学从自己右手边找到离自己最近的、编程能力比自己弱的两名同学组成学习小组。如果没有比自己编程能力弱的同学,则在学习小组中对应位置输出 − 1 -1 1

现在给定 n n n 名同学的编程能力值,请你帮助K小姐按以上方法划分学习小组。

输入格式

第一行包含一个正整数 n n n,表示班级中同学的总数。

第二行包含 n n n 个整数,表示每个同学的编程能力值,第 i i i 个整数表示第 i i i 号同学的编程能力值。

输出格式

输出 n n n 行,每行 3 3 3 个整数,表示一个学习小组。其中第 i i i 行表示第 i i i 号同学的学习小组,第一个整数是第 i i i 号同学的编号,后两个整数是小组中另外两名编程能力弱于第 i i i 号同学的同学的编号。如果找不到符合条件的同学,则在对应位置输出 − 1 -1 1

样例输入

[7,3,10,20,16]

样例输出

[[0,1,-1],[1,-1,-1],[2,0,1],[3,4,0],[4,0,1]]

数据范围

  • 1 ≤ n ≤ 1 0 5 1 \leq n \leq 10^5 1n105
  • 编程能力值是 [ 0 , 1 0 9 ] [0,10^9] [0,109] 内的整数
  • 对于 30 % 30\% 30% 的数据, n < 1000 n<1000 n<1000
  • 对于 70 % 70\% 70% 的数据, 1000 ≤ n ≤ 1 0 5 1000 \leq n \leq 10^5 1000n105

题解

本题可以使用单调栈来解决。我们可以从右往左遍历同学,维护一个单调递减的栈,栈中存储同学的编号。对于当前遍历到的同学 i i i,可以从栈顶弹出编程能力大于等于当前同学的同学,直到栈为空或者栈顶同学的编程能力小于当前同学。此时栈中剩余的同学就是编程能力小于当前同学的同学,我们可以从栈顶取出最多两个同学作为当前同学的学习小组成员。

具体实现时,我们可以先从右往左遍历一次同学,初始化单调栈;然后再从右往左遍历一次同学,利用单调栈找到每个同学的学习小组成员。最后对于学习小组成员不足两个的同学,在对应位置补 − 1 -1 1 即可。

时间复杂度 O ( n ) O(n) O(n),空间复杂度 O ( n ) O(n) O(n)

参考代码

  • Python
def find_group(score):
    n = len(score)
    res = [[] for _ in range(n)]
    for i in range(n):
        res[i].append(i)
    st = []
    
    def cal(i):
        m = len(st)
        m -= 1
        while len(res[i]) < 3 and m >= 0:
            res[i].append(st[m])
            m -= 1

    for i in range(n - 1, -1, -1):
        while st and score[st[-1]] >= score[i]:
            st.pop()
        st.append(i)

    for i in range(n - 1, -1, -1):
        while st and score[st[-1]] >= score[i]:
            st.pop()
        cal(i)
        st.append(i)

    for i in range(n):
        while len(res[i]) < 3:
            res[i].append(-1)

    return res
  • Java
public static List<List<Long>> findGroup(List<Long> score) {
        int n = score.size();
        List<List<Long>> res = new ArrayList<>(n);
        for (int i = 0; i < n; i++) {
            List<Long> temp = new ArrayList<>();
            temp.add((long) i);
            res.add(temp);
        }
        Stack<Integer> st = new Stack<>();
        for (int i = n - 1; i >= 0; i--) {
            while (!st.isEmpty() && score.get(st.peek()) >= score.get(i))
                st.pop();
            st.push(i);
        }
        for (int i = n - 1; i >= 0; i--) {
            while (!st.isEmpty() && score.get(st.peek()) >= score.get(i))
                st.pop();
            cal(res, i, st);
            st.push(i);
        }
        for (List<Long> list : res) {
            while (list.size() < 3)
                list.add(-1L);
        }
        return res;
    }

  • Cpp
vector<vector<long>> findGroup(vector<long>& score){
    int n = score.size();
    vector<vector<long>> res(n);
    for(int i = 0; i < n; i++){
        res[i].push_back(i);
    }
    vector<int> st;
    auto cal = [&](int i){
        int m = st.size();
        m -- ;
        while(res[i].size() < 3 && m >= 0)
            res[i].push_back(st[m --]);
    };
    for(int i = n - 1; i >= 0; i --)
    {
        while(st.size() && score[st.back()] >= score[i])
            st.pop_back();
        st.push_back(i);
    }
    for(int i = n - 1; i >= 0; i --)
    {
        while(st.size() && score[st.back()] >= score[i])
            st.pop_back();
        cal(i);
        st.push_back(i);
    }
    for(int i = 0; i < n; i ++)
    	while(res[i].size() < 3)
            res[i].push_back(-1);
    return res;
}

🎹 02.LYA 的跳跃游戏

问题描述

LYA 在玩一个跳跃游戏。游戏地图可以看作一个非负整数数组 a r r arr arr,数组中的每个元素表示在该位置可以跳跃的最大长度。LYA 最开始位于下标 s t a r t start start 处,每次可以向左或向右跳跃。当他位于下标 i i i 处时,他可以跳到 i + a r r [ i ] i+arr[i] i+arr[i] 或者 i − a r r [ i ] i-arr[i] iarr[i]

LYA 的目标是跳到下标 e n d end end 处。请问他至少需要跳跃几次才能到达目的地?如果无法到达,则返回 − 1 -1 1

输入格式

第一行包含一个正整数 n n n,表示数组 a r r arr arr 的长度。

第二行包含一个正整数 s t a r t start start,表示 LYA 的起始位置。

第三行包含一个正整数 e n d end end,表示 LYA 的目标位置。

第四行包含 n n n 个非负整数,表示数组 a r r arr arr,相邻整数之间用一个空格分隔。

输出格式

输出一个整数,表示 LYA 跳到目标位置所需的最少跳跃次数。如果无法到达,则输出 − 1 -1 1

样例输入

7
5
3
4 2 3 0 3 1 2

样例输出

3

数据范围

  • 1 ≤ n ≤ 5 × 1 0 4 1 \leq n \leq 5 \times 10^4 1n5×104
  • 0 ≤ a r r [ i ] < n 0 \leq arr[i] < n 0arr[i]<n
  • 0 ≤ s t a r t , e n d < n 0 \leq start, end < n 0start,end<n

题解

本题可以使用 BFS 求解。从起点 s t a r t start start 开始,每次可以向左或向右跳跃,直到到达终点 e n d end end

具体做法如下:

  1. 使用队列 q q q 存储当前可以跳到的位置,初始时将起点 s t a r t start start 加入队列。
  2. 使用数组 d d d 记录到达每个位置需要的最少跳跃次数,初始时 d [ s t a r t ] = 0 d[start]=0 d[start]=0,其余位置为 − 1 -1 1
  3. 当队列不为空时,取出队首位置 u u u:
    • 如果 u u u 等于终点 e n d end end,则返回 d [ u ] d[u] d[u]
    • 如果 u + a r r [ u ] u+arr[u] u+arr[u] 在数组范围内且未访问过,则将其加入队列,并更新 d [ u + a r r [ u ] ] = d [ u ] + 1 d[u+arr[u]]=d[u]+1 d[u+arr[u]]=d[u]+1
    • 如果 u − a r r [ u ] u-arr[u] uarr[u] 在数组范围内且未访问过,则将其加入队列,并更新 d [ u − a r r [ u ] ] = d [ u ] + 1 d[u-arr[u]]=d[u]+1 d[uarr[u]]=d[u]+1
  4. 如果队列为空时仍未到达终点,说明无法到达,返回 − 1 -1 1

时间复杂度 O ( n ) O(n) O(n),空间复杂度 O ( n ) O(n) O(n)。其中 n n n 为数组长度。

参考代码

  • Python
from collections import deque

n = int(input())
start = int(input())
end = int(input())
arr = list(map(int, input().split()))

def bfs():
    if start == end:
        return 0
    q = deque([start])
    d = [-1] * n
    d[start] = 0
    while q:
        u = q.popleft()
        if u == end:
            return d[u]
        if u + arr[u] < n and d[u + arr[u]] == -1:
            q.append(u + arr[u])
            d[u + arr[u]] = d[u] + 1
        if u - arr[u] >= 0 and d[u - arr[u]] == -1:
            q.append(u - arr[u])
            d[u - arr[u]] = d[u] + 1
    return -1

print(bfs())
  • Java
import java.util.*;

public class Main {
    static int n, start, end;
    static int[] arr, d;

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        n = sc.nextInt();
        start = sc.nextInt();
        end = sc.nextInt();
        arr = new int[n];
        for (int i = 0; i < n; i++) {
            arr[i] = sc.nextInt();
        }
        System.out.println(bfs());
    }

    static int bfs() {
        if (start == end) {
            return 0;
        }
        Queue<Integer> q = new LinkedList<>();
        q.offer(start);
        d = new int[n];
        Arrays.fill(d, -1);
        d[start] = 0;
        while (!q.isEmpty()) {
            int u = q.poll();
            if (u == end) {
                return d[u];
            }
            if (u + arr[u] < n && d[u + arr[u]] == -1) {
                q.offer(u + arr[u]);
                d[u + arr[u]] = d[u] + 1;
            }
            if (u - arr[u] >= 0 && d[u - arr[u]] == -1) {
                q.offer(u - arr[u]);
                d[u - arr[u]] = d[u] + 1;
            }
        }
        return -1;
    }
}
  • Cpp
#include <bits/stdc++.h>
using namespace std;

const int N = 50010;
int n, start, ed;
int arr[N], d[N];

int bfs() {
    if (start == ed) return 0;
    queue<int> q;
    q.push(start);
    memset(d, -1, sizeof(d));
    d[start] = 0;
    while (!q.empty()) {
        int u = q.front();
        q.pop();
        if (u == ed) return d[u];
        if (u + arr[u] < n && d[u + arr[u]] == -1) {
            q.push(u + arr[u]);
            d[u + arr[u]] = d[u] + 1;
        }
        if (u - arr[u] >= 0 && d[u - arr[u]] == -1) {
            q.push(u - arr[u]);
            d[u - arr[u]] = d[u] + 1;
        }
    }
    return -1;
}

int main() {
    cin >> n >> start >> ed;
    for (int i = 0; i < n; i++) {
        cin >> arr[i];
    }
    cout << bfs() << endl;
    return 0;
}

写在最后

📧 KK这边最近正在收集近一年互联网各厂的笔试题汇总,如果有需要的小伙伴可以关注后私信一下 KK领取,会在飞书进行同步的跟新。

在这里插入图片描述

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

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

相关文章

【感谢】心怀感恩,共赴知识之旅——致每一位陪伴我突破百万总访问量的您

小伙伴朋友们&#xff1a; 此刻&#xff0c;我怀着无比激动与深深感激的心情&#xff0c;写下这篇特别的博文。今天&#xff0c;我的CSDN总访问量成功突破了百万大关&#xff0c;这不仅是一个数字的跨越&#xff0c;更是你们对我的支持、信任与鼓励的有力见证。在此&#xff0…

前端Vue自定义勾选协议组件的开发与应用

摘要&#xff1a; 随着前端技术的不断发展&#xff0c;用户体验成为了软件开发中的关键要素。在登录、注册等场景中&#xff0c;勾选协议是常见的需求。本文旨在介绍一款基于 Vue.js 的自定义勾选协议组件的开发与应用&#xff0c;该组件适用于多种场景&#xff0c;并且具备良…

图形学基础:二维三维刚体的移动、缩放和旋转矩阵

一、二维 1.1 缩放矩阵 x&#xff0c;y分别表示在x轴&#xff0c;y轴缩放的倍数 示例&#xff1a; 点(2,1)在x&#xff0c;y轴上分别缩放x倍&#xff0c;y倍 1.2 平移矩阵 x&#xff0c;y分表表示在x轴&#xff0c;y轴上移动的距离 示例&#xff1a;点&#xff08;2,1&#xf…

C语言——指针的高级引用

目录 1.概述 2.虚拟内存空间 2.1存储期限 2.2栈区管理 2.3堆区域的使用 3.动态内存分配和释放&#xff08;重点&#xff09; 3.1通用指针类型void 3.2内存分配malloc函数 3.2.1 malloc函数&#xff08;memory allocation&#xff09;&#xff08;注意len*size&#xff…

工智能图像降噪软件 ON1 NoNoise AI 2024 for Mac激活版

ON1 NoNoise AI 2024 for Mac是一款专为Mac用户设计的先进人工智能图像降噪软件。其核心功能在于能够利用机器学习技术&#xff0c;快速并智能地消除图像中的噪点&#xff0c;无论是亮度噪点还是颜色噪点&#xff0c;都能得到显著的改善。 软件下载&#xff1a;ON1 NoNoise AI …

【高项】信息化发展

目录 1.1 信息与信息化 1.1.1 信息 1.信息的定义 2.信息的特征与质量 1.1.2 信息系统 1.信息系统及其特性 2.信息系统生命周期 1.1.3 信息化 1.信息化内涵 2.信息化体系&#xff08;口诀&#xff1a;上应下技左人右规&#xff0c;中资网&#xff09; 1.2 现代化基础…

Vue笔记 2

数据代理 数据代理&#xff1a;通过一个对象代理对另一个对象中属性的操作&#xff08;读/写&#xff09; let obj{x:100} let obj2{y:200} Object.defineProperty(obj2,x,{get(){return obj.x},set(value){obj.x value} })Vue中的数据代理 Vue中的数据代理&#xff1a; 通…

【go从入门到精通】作用域,包详解

作者简介&#xff1a; 高科&#xff0c;先后在 IBM PlatformComputing从事网格计算&#xff0c;淘米网&#xff0c;网易从事游戏服务器开发&#xff0c;拥有丰富的C&#xff0c;go等语言开发经验&#xff0c;mysql&#xff0c;mongo&#xff0c;redis等数据库&#xff0c;设计模…

u盘为什么一插上电脑就蓝屏,u盘一插电脑就蓝屏

u盘之前还好好的,可以传输文件,使用正常,但是最近使用时却出现问题了。只要将u盘一插入电脑,电脑就显示蓝屏。u盘为什么一插上电脑就蓝屏呢?一般,导致的原因有以下几种。一,主板的SATA或IDE控制器驱动损坏或安装不当;二,电脑系统分区存在磁盘或文件故障错误;三,电脑中…

【力扣】125.验证回文串

刷题&#xff0c;过了真的好有成就感&#xff01;&#xff01;&#xff01; 题解&#xff1a; 根据题目要求&#xff0c;我们需要处理一下几个问题&#xff1a; 将大写字母转变成小写对原来的字符串进行处理&#xff0c;只要字母和数字考虑只有一个和字符串为空的情况 1、将…

element-ui backtop 组件源码分享

今日简单分享 backtop 组件的源码实现&#xff0c;从以下三个方面&#xff1a; 1、backtop 组件页面结构 2、backtop 组件属性 3、backtop 组件事件 一、backtop 组件页面结构 二、backtop 组件属性 2.1 target 属性&#xff0c;触发滚动的对象&#xff0c;类型 string&am…

【保姆级讲解Nginx】

&#x1f308;个人主页: 程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…

【Linux系统编程】第一弹---背景介绍

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】 目录 1、Linux 背景介绍 1.1、发展史 1.1.1、UNIX发展的历史 1.1.2、Linux发展历史 2、开源精神 3、Linux内核官网 4、企业应用…

SAP SD学习笔记04 - 出荷Plant(交货工厂),出荷Point(装运点),输送计划,品目的可用性检查,一括纳入/分割纳入,仓库管理

上一章讲了SD的主数据。 SAP SD学习笔记03 - SD模块中的主数据-CSDN博客 本章讲出荷Plant&#xff08;交货工厂&#xff09;&#xff0c;出荷Point&#xff08;装运点&#xff09;和出和路线。 还是偏理论多一些&#xff0c;后面的文章尽量多加些练习巩固一下。 1&#xff0…

2024年思维100春季线上比赛倒计时8天,来做做官方样题

今天是2024年4月12日&#xff0c;距离2024年春季思维100活动第一阶段的线上比赛4月20日还有8天。今年思维100活动的考试重点是什么呢&#xff1f;虽然主办方未公布&#xff0c;我们可以从主办方发布的参考题目中来推测今年的考试重点&#xff0c;并且按照这个来举一反三&#x…

PP-LCNet:一种轻量级CPU卷积神经网络

PP-LCNet: A Lightweight CPU Convolutional Neural Network 最近看了一个新的分享&#xff0c;在图像分类的任务上表现良好&#xff0c;具有很高的实践意义。 论文&#xff1a; https://arxiv.org/pdf/2109.15099.pdf项目&#xff1a; https://github.com/PaddlePaddle/Padd…

百科引流攻略|小马识途分享百科营销的五个技巧

纵观整个互联网领域&#xff0c;国内几大巨头百度、抖音、腾讯都布局了自身的百科平台&#xff0c;百科营销也始终作为网络营销一个重要分支而存在。很多人都知道百科营销是品牌背书的一把王牌&#xff0c;但很少有人提及百科营销的引流作用。 有人可能会说&#xff0c;百科词条…

K8S资源管理之计算资源管理

1.详解Requests和Limits参数 以CPU为例&#xff0c;下图显示了未设置Limits与设置了Requests和Limits的CPU使用率的区别 尽管Requests和Limits只能被设置到容器上&#xff0c;但是设置了Pod级别的Requests和Limits能大大提高管理Pod的便利性和灵活性&#xff0c;因此在Kubernet…

【RV1106的ISP使用记录之二】设备树的构建

基于MIPI接口的两种摄像头接入方式&#xff0c;理清楚各链路关系&#xff0c;方便后续的开发调试工作&#xff0c;先上一张图&#xff0c;后面再补充解释。

Git可视化工具 - 推荐

概述 Git版本管理工具是我们日常开发中常用的工具&#xff0c;熟练使用它可以提高我们的工作效率。 当然老司机基本使用命令行的方式进行操作&#xff0c;新手可借助可视化工具来进行过渡&#xff0c;命令行与可视化工具结合使用来加深对Git的熟悉程度。 下面推荐两个较受欢迎…
最新文章