首页 > 试题广场 >

小美的排列询问

[编程题]小美的排列询问
  • 热度指数:3397 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
小美拿到了一个排列。她想知道在这个排列中,xy是否是相邻的。你能帮帮她吗?

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

输入描述:
第一行输入一个正整数n,代表排列的长度。
第二行输入n个正整数a_i,代表排列的元素。
第三行输入两个正整数xy,用空格隔开。
1\leq n \leq 200000
1\leq a_i,x,y \leq n
保证x≠y


输出描述:
如果xy在排列中相邻,则输出"Yes"。否则输出"No"。
示例1

输入

4
1 4 2 3
2 4

输出

Yes
示例2

输入

5
3 4 5 1 2
3 2

输出

No
输入完可以不用for循环
import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
       // 注意 hasNext 和 hasNextLine 的区别
       int n = in.nextInt();
       int[] a = new int [n+1];
       for(int i=1;i<n+1;i++)
           a[in.nextInt()] = i;
       int x = in.nextInt();
       int y = in.nextInt();
       if(a[x] - a[y] == 1 || a[y] - a[x] == 1)
           System.out.println("Yes");
       else
           System.out.println("No");
    }
}
发表于 2023-08-23 15:35:55 回复(3)
我直接秒

import sys a = list(map(int, input().split())) # 将一行输入转为整数数组
x, y = map(int, input().split()) # 将一行输入转为两个整数

if abs(a.index(x) - a.index(y)) == 1: # 使用 abs() 计算绝对值
    print('Yes')
else:
    print('No')

编辑于 2024-03-08 23:38:02 回复(1)

使用mapm来存放位置,题目说了数据不会重复。
输出时只需要看位置是否相邻即可。
运行时间:685ms 占用内存:16864

package main
import "fmt"
func main() {
    var n, a, x, y int
    _, _ = fmt.Scan(&n)
    m := make(map[int]int)
    for i := 0; i < n; i++ {
        _, _ = fmt.Scan(&a)
        m[a] = i
    }
    _, _ = fmt.Scan(&x, &y)
    if (m[x] == (m[y] + 1)) || (m[x] == (m[y] - 1)) {
        fmt.Print("Yes")
    } else {
        fmt.Print("No")
    }
    return
}
发表于 2024-04-13 13:02:49 回复(0)
Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        HashMap map = new HashMap();
        while(n-->0){
            int a = in.nextInt();
            map.put(a, n);
        }
        // String[] c = in.nextLine().split(" ");
        // int x = Integer.parseInt(c[0]);
        // int y = Integer.parseInt(c[1]);
        int x = in.nextInt();
        int y = in.nextInt();
        int xIndex = map.get(x);
        int yIndex = map.get(y);
        if (Math.abs(xIndex-yIndex)==1)
            System.out.printf("Yes");
        else
            System.out.printf("No");
    }
编辑于 2024-04-11 13:50:01 回复(0)
import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        //position[i]代表数字i出现的位置
        int[] position = new int[n + 1];
        for (int i = 0; i < n; i++) {
            position[in.nextInt()] = i;
        }
        if (Math.abs(position[in.nextInt()] - position[in.nextInt()]) == 1) {
            System.out.println("Yes");
        } else {
            System.out.println("No");
        }
    }
} 

用一个position数字记录位置,position[i]代表数字I在排列里面的最终位置。
唯一需要注意的就是数组不用越界。
编辑于 2024-03-09 17:17:08 回复(0)
这道题可以直接模拟
#include <iostream>
using namespace std;

int main() 
{
   int x,y,n;
   cin>>n;
   int array[n];
   for(int i = 0;i<n;i++)
   {
   		cin>>array[i];
   }
   
   cin>>x>>y;
   for(int i = 0;i<n;i++)
   {
   		if(array[i] == x||array[i] == y)
   		{
   			if(array[i] == x&&array[i+1] == y)
			{
				cout<<"Yes";
				return 0;
			}
			else if(array[i] == y&&array[i+1] == x)
			{
				cout<<"Yes";
				return 0;	
			} 
			else
				continue;
		}
		else 
			continue;
   }
   cout<<"No";
}


发表于 2023-11-16 22:48:33 回复(0)
python 可以直接运用数组的index查找出x的索引,判断左右两边是否有值等于y即可,不用循环
def sol(n,arr,x,y):
    idx = arr.index(x)
    isNear = 'No'
    if idx-1>0:
        if arr[idx-1] == y:
            isNear = 'Yes'
    if idx+1<n:
        if arr[idx+1] == y:
            isNear = 'Yes'        
    return isNear
    
while 1:
    try:
        n = int(input())
        arr = list(map(int,input().split()))
        x,y = map(int,input().split())
        ans = sol(n,arr,x,y)
        print(ans)
    except:
        break


发表于 2023-10-21 02:31:31 回复(0)

python

n = int(input())
res = 0
m = list(map(int, input().split()))
l, r = list(map(int, input().split()))
for i in range(1, n):
    if m[i] == l:
        if m[i - 1] == r:
            res = 1
    if m[i] == r:
        if m[i - 1] == l:
            res = 1
if res:
    print("Yes")
else:
    print("No")
发表于 2023-09-02 17:34:54 回复(0)
#include <ios>
#include <iostream>
#include <vector>
using namespace std;

int main() {
    int n;
    cin >> n;
    if(n < 1 || n > 200000) {
        cout << "No";
    }
    
    vector<int> a(n,0);
    for(int i = 0; i < n; i++){
        cin >> a[i];
        if(a[i]<1 || a[i] > n)
            cout << "No";
    }

    int x, y;
    cin >> x >> y;
    if(x == y || x<1 || x>n || y<1 || y>n)
        cout << "No";
    
    ////找到x,y的下标
    int x_i, y_i;
    for(int i = 0; i < n; ++i){
        if(a[i] == x) x_i = i;
        if(a[i] == y) y_i = i;
    }
    if(abs(x_i - y_i) == 1)
        cout << "Yes";
    else
        cout << "No";
}
// 64 位输出请用 printf("%lld")
发表于 2023-08-22 01:37:00 回复(0)
#include <iostream>
using namespace std;

int main() {
    int n;
   cin>>n;
   int a[n];
   int i=0;
   for(;i<n;i++)
   {
    cin>>a[i];
   }
   int x,y;
   cin>>x>>y;
   for(i=0;i<n;i++)
   {
    if(x==a[i])
    {
        if(y==a[i+1])
        {
            cout <<"Yes";
            
        }
        else if(y==a[i-1])
        {
             cout <<"Yes";
             
        }
        else
        {
            cout << "No";
        }
        
    }
   }
   
}

发表于 2023-08-19 16:42:01 回复(0)
importsys
 
n = sys.stdin.readlines()
 
num = n[1].strip().split()
dic = {}
fori in range(1,len(num)-1):
    ifnum[i] not in dic:
        dic[num[i]] = []
    dic[num[i]].append(num[i-1])
    dic[num[i]].append(num[i+1])
dic[num[0]] = [num[1]]
dic[num[-1]]=[num[-2]]
ifn[2].strip().split()[1] in dic[n[2].strip().split()[0]]:
    print('Yes')
    exit()
print('No')


编辑于 2023-08-18 18:33:51 回复(0)