169.小c的排列询问

81 阅读4分钟

豆包MarsCode AI 刷题-----169.小c的排列询问

问题描述

小C拿到了一个排列,她想知道在这个排列中,元素 xx 和 yy 是否是相邻的。排列是一个长度为 nn 的数组,其中每个数字从 11 到 nn 恰好出现一次。 你的任务是判断在给定的排列中,xx 和 yy 是否是相邻的。


测试样例

样例1:

输入:n = 4, a = [1, 4, 2, 3], x = 2, y = 4
输出:True

样例2:

输入:n = 5, a = [3, 4, 5, 1, 2], x = 3, y = 2
输出:False

样例3:

输入:n = 6, a = [6, 1, 5, 2, 4, 3], x = 5, y = 2
输出:True 在探讨如何判断给定排列中两个元素是否相邻的问题时,我们将从思路分析、可能的图解辅助理解以及代码的详细解释这几个方面来深入剖析。

一、思路分析

题目给定了一个长度为 n 的排列数组 a,其中包含从 1n 的数字且每个数字恰好出现一次,我们需要判断元素 xy 在该排列中是否相邻。

最直接的思路就是遍历这个排列数组。由于要判断的是相邻元素关系,所以我们依次检查数组中的每一对相邻元素。对于每一对相邻元素,判断是否存在一种情况,即这对元素分别是 xy(顺序不限)。如果在遍历过程中找到了这样的一对相邻元素,那么就可以确定 xy 在排列中是相邻的,直接返回 true;如果遍历完整个数组都没有找到这样的相邻对,那就说明 xy 在该排列中不是相邻的,返回 false

二、图解(以样例 1:n = 4, a = [1, 4, 2, 3], x = 2, y = 4 为例)

我们可以将这个排列数组想象成一个序列:

位置元素
01
14
22
33

在遍历过程中,首先检查位置 0 和位置 1 的元素 14,它们不是 24。接着检查位置 1 和位置 2 的元素 42,发现这就是我们要找的 x = 2y = 4 的相邻情况,此时就可以确定返回 true

通过这个简单的图解,可以更直观地看到遍历过程中是如何判断相邻元素的。

三、代码详解

以下是实现判断功能的 Java 代码:

public class Main {
    public static boolean solution(int n, int[] a, int x, int y) {
        // 遍历排列数组 a,注意只需要遍历到倒数第二个元素,因为要检查相邻对
        for (int i = 0; i < n - 1; i++) { 
            // 判断当前位置 i 的元素和下一个位置 i + 1 的元素是否为 x 和 y 的相邻组合
            if ((a[i] == x && a[i + 1] == y) || (a[i] == y && a[i + 1] == x)) { 
                return true; // 如果找到满足条件的相邻对,立即返回 true
            }
        }
        return false; // 如果遍历完整个数组都没有找到,返回 false
    }

    public static void main(String[] args) {
        System.out.println(solution(4, new int[]{1, 4, 2, 3}, 2, 4) == true);
        System.out.println(solution(5, new int[]{3, 4, 5, 1, 2}, 3, 2) == false);
        System.out.println(solution(6, new int[]{6, 1, 5, 2, 4, 3}, 5, 2) == true);
    }
}

solution 方法中:

  • for 循环从数组的起始位置 0 开始,一直到倒数第二个位置 n - 2(因为 i + 1 不能超出数组范围)。在每次循环中:

    • 通过 if 语句判断当前位置 i 的元素 a[i] 和下一个位置 i + 1 的元素 a[i + 1] 是否构成了 xy 的相邻关系。这里使用逻辑或 || 连接了两种可能的情况:a[i] == x && a[i + 1] == y 表示 x 在前 y 在后的相邻情况;a[i] == y && a[i + 1] == x 表示 y 在前 x 在后的相邻情况。
    • 如果满足其中一种相邻情况,就直接返回 true,表示找到了 xy 是相邻的。
  • 如果整个 for 循环结束都没有返回 true,那就说明没有找到满足条件的相邻对,最后返回 false

main 方法中,对给定的测试样例进行了验证,通过比较 solution 方法返回值与预期值是否相等,输出相应的结果(1 表示通过验证,0 表示未通过验证)。这种代码实现简洁明了地完成了判断排列中两个元素是否相邻的任务,并且通过遍历的方式确保了对所有可能的相邻元素对都进行了检查。