大家好,我是吴师兄,关注我,每周更新大厂最新笔试题解析。
题目描述
小美拿到了一个排列。她想知道在这个排列中,x
和y
是否是相邻的。你能帮帮她吗?
排列是指一个长度为n
的数组,其中 1
到 n
每个元素恰好出现一次。
输入描述
第一行输入一个正整数n
,代表排列的长度。
第二行输入n
个正整数ai
,代表排列的元素。
第三行输入两个正整数x
和y
,用空格隔开。
1 <= n <= 2*10^5
1 <= ai, x, y <= n
x != y
输出描述
如果x
和y
在排列中相邻,则输出"Yes"
。否则输出"No"
。
示例一
输入
代码语言:javascript复制4
1 4 2 3
2 4
输出
代码语言:javascript复制Yes
示例二
输入
代码语言:javascript复制5
3 4 5 1 2
3 2
输出
代码语言:javascript复制No
解题思路
简单题,一次遍历数组,判断是否有和x
、y
相等并且相连即可。
可优化逻辑:因为x
和y
是后输入的,必须存储整个数组,但是上面说了 排列是指一个长度为n的数组,其中 1 到n 每个元素恰好出现一次。可以充分利用该信息创建一个大小为n 1
的数组存储各个元素的所在位置,这样最终直接判断x
和y
所在位置差是否为1
即可判断结果。
代码
解法一:哈希表
Python
代码语言:javascript复制# 题目:【哈希表】美团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
代码语言:javascript复制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
代码语言:javascript复制#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
代码语言:javascript复制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
代码语言:javascript复制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
代码语言:javascript复制#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)
。无需额外空间。