首页   

美团2023秋招笔试真题解析

算法与数据结构  · 算法  · 1 周前
来自公众号:吴师兄学算法

题目描述

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

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

输入描述

第一行输入一个正整数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             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 
#include 
#include 
using namespace std;

int main() {
    int n;
    cin >> n;

    vector<intarr(n);
    vector<intmap(n + 10);
    for (int i = 0; i         cin >> arr[i];
        map[arr[i]] = i;
    }
    
    int x, y;
    cin >> x >> y;

    if (abs(map[x] - map[y]) == 1) {
        cout <"Yes"     } else {
        cout <"No"     }
    
    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             arr[i] = scanner.nextInt();
        }
        int x = scanner.nextInt();
        int y = scanner.nextInt();

        for (int i = 0; i 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 
using namespace std;

int main() {
    int n;
    cin >> n;

    int arr[n];
    for (int i = 0; i         cin >> arr[i];
    }
    
    int x, y;
    cin >> x >> y;

    for (int i = 0; i 1; i++) {
        if ((arr[i] == x && arr[i + 1] == y) || (arr[i] == y && arr[i + 1] == x)) {
            cout <"Yes"             return 0;
        }
    }
    cout <"No"     
    return 0;
}

时空复杂度

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

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


---END---

© 2024 精读
删除内容请联系邮箱 2879853325@qq.com