青训营X豆包MarsCode刷题 169 小C的排列询问 | 豆包MarsCode AI 刷题

102 阅读3分钟

题目描述
给定一个排列数组 a,判断元素 x 和 y 是否相邻。排列是长度为 n 的数组,其中每个数字从 1 到 n 恰好出现一次。

问题分析

  1. 核心思路

    • 找出 x 和 y 在数组中的索引。
    • 检查索引的绝对差值是否为 1。
  2. 解决步骤

    • 遍历数组,找到 x 和 y 的索引。
    • 比较两个索引值是否相邻。
    • 返回判断结果。

二、代码实现

C++ 实现:

#include <iostream>
#include <vector>
#include <cmath> // abs() 函数

using namespace std;

// 判断 x 和 y 是否相邻
bool solution(int n, vector<int> a, int x, int y) {
    int index_x = -1, index_y = -1;

    // 遍历数组找到 x 和 y 的索引
    for (int i = 0; i < n; ++i) {
        if (a[i] == x) index_x = i;
        if (a[i] == y) index_y = i;
        if (index_x != -1 && index_y != -1) break; // 找到即可退出循环
    }

    // 判断索引是否相邻
    return abs(index_x - index_y) == 1;
}

int main() {
    cout << (solution(4, {1, 4, 2, 3}, 2, 4) == true) << endl;
    cout << (solution(5, {3, 4, 5, 1, 2}, 3, 2) == false) << endl;
    cout << (solution(6, {6, 1, 5, 2, 4, 3}, 5, 2) == true) << endl;
    return 0;
}

三、知识总结

C++ 知识点

  1. 数组遍历
    使用 for 循环查找目标元素的索引:

    for (int i = 0; i < n; ++i) {
        if (a[i] == x) index_x = i;
        if (a[i] == y) index_y = i;
    }
    

    时间复杂度为 O(n)。

  2. 绝对值函数
    abs() 函数在 <cmath> 头文件中,计算两索引的差值:

    return abs(index_x - index_y) == 1;
    
  3. 输出格式化
    条件语句结合 cout 格式化输出结果:

    cout << (solution(5, {3, 4, 5, 1, 2}, 3, 2) == false) << endl;
    

四、个人理解与建议

  1. 排列特点
    排列中元素唯一且完整性明确,减少了复杂度,只需关注索引操作即可。

  2. 代码简化
    可用 break 提前退出循环,优化性能。

  3. 理解题目特点
    排列的特性让我们可以不用考虑重复值或无效输入,这是降低复杂度的关键。

  4. 提升解法效率
    对于大规模数组,可以尝试用哈希表预处理索引位置,将查找时间复杂度从 O(n) 降低到 O(1)。


五、学习计划

  1. 基础刷题
    每天完成 1-2 道与数组索引相关的问题,锻炼基本逻辑。
  2. 代码优化
    尝试扩展到更大规模数据集,比如用哈希表优化查找操作。
  3. 错题分析
    将错题进行归类总结,分析造成错误的原因。

六、工具运用

  1. MarsCode AI

    • 通过其代码解析功能验证逻辑正确性。
    • 使用 AI 提供的边界测试样例,检查代码健壮性。
  2. 在线平台

    • 利用 LeetCode 或其他在线平台搜索相似问题,扩展知识面。

七、总结

本题是一个基础的数组索引操作问题,关键在于理解排列的特性和索引相邻的数学逻辑。在实现上,通过简单的循环和条件判断即可解决问题,但通过代码优化和测试可以提升代码的效率和可靠性。希望这篇博客能帮助初学者理解类似问题的核心解法,并从中获得启发!