大厂真题:【哈希表】美团2023秋招

编程入门 行业动态 更新时间:2024-10-20 07:57:35

大厂<a href=https://www.elefans.com/category/jswz/34/1769885.html style=真题:【哈希表】美团2023秋招"/>

大厂真题:【哈希表】美团2023秋招

题目描述与示例

题目描述

小美拿到了一个排列。她想知道在这个排列中,xy是否是相邻的。你能帮帮她吗?

排列是指一个长度为n的数组,其中 1n 每个元素恰好出现一次。

输入描述

第一行输入一个正整数n,代表排列的长度。

第二行输入n个正整数ai,代表排列的元素。

第三行输入两个正整数xy,用空格隔开。

1 <= n <= 2*10^5
1 <= ai, x, y <= n
x != y

输出描述

如果xy在排列中相邻,则输出"Yes"。否则输出"No"

示例一

输入

4
1 4 2 3
2 4

输出

Yes

示例二

输入

5
3 4 5 1 2
3 2

输出

No

解题思路

简单题,一次遍历数组,判断是否有和xy相等并且相连即可。

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

代码

解法一:哈希表

Python

# 题目:【哈希表】美团2023秋招-小美的排列询问
# 作者:闭着眼睛学数理化
# 算法:哈希表
# 代码有看不懂的地方请直接在群上提问n = int(input())
nums = list(map(int, input().split()))
x, y = map(int, input().split())
# 构建哈希表,用哈希表储存x和y的下标
dic = dict()# 遍历整个数组,记录x和y的下标
for i, num in enumerate(nums):if num == x or num == y:dic[num] = i# 若下标差的绝对值为1,则说明相邻,输出"Yes",否则输出"No"
if abs(dic[x] - dic[y]) == 1:print("Yes")
else:print("No")

Java

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");}
}

C++

#include <iostream>
#include <vector>
#include <cmath>
using namespace std;int main() {int n;cin >> n;vector<int> arr(n);vector<int> map(n + 1, 0);for (int i = 0; i < n; i++) {cin >> arr[i];map[arr[i]] = i;}int x, y;cin >> x >> y;if (abs(map[x] - map[y]) == 1) {cout << "Yes" << endl;} else {cout << "No" << endl;}return 0;
}

时空复杂度

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

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

解法二:直接模拟

Python

n = int(input())
arr = list(map(int, input().split()))
x, y = map(int, input().split())for i in range(n - 1):if (arr[i] == x and arr[i + 1] == y) or (arr[i] == y and arr[i + 1] == x):print("Yes")break
else:print("No")

Java

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();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");}
}

C++

#include <iostream>
using namespace std;int main() {int n;cin >> n;int arr[n];for (int i = 0; i < n; i++) {cin >> arr[i];}int x, y;cin >> x >> y;for (int i = 0; i < n - 1; i++) {if ((arr[i] == x && arr[i + 1] == y) || (arr[i] == y && arr[i + 1] == x)) {cout << "Yes" << endl;return 0;}}cout << "No" << endl;return 0;
}

时空复杂度

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

空间复杂度:O(1)。无需额外空间。

华为OD算法/大厂面试高频题算法练习冲刺训练

  • 华为OD算法/大厂面试高频题算法冲刺训练目前开始常态化报名!目前已服务100+同学成功上岸!

  • 课程讲师为全网50w+粉丝编程博主@吴师兄学算法 以及小红书头部编程博主@闭着眼睛学数理化

  • 每期人数维持在20人内,保证能够最大限度地满足到每一个同学的需求,达到和1v1同样的学习效果!

  • 60+天陪伴式学习,40+直播课时,300+动画图解视频,300+LeetCode经典题,200+华为OD真题/大厂真题,还有简历修改、模拟面试、专属HR对接将为你解锁

  • 可上全网独家的欧弟OJ系统练习华子OD、大厂真题

  • 可查看链接 OD算法冲刺训练课程表 & OD真题汇总(持续更新)

  • 绿色聊天软件戳 od1336了解更多

更多推荐

大厂真题:【哈希表】美团2023秋招

本文发布于:2023-11-15 06:12:52,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1595058.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:真题   哈希表

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!