数字匹配问题 | 豆包MarsCode AI刷题

164 阅读4分钟

为什么使用 AI 刷题

随着人工智能技术的快速发展,利用 AI 辅助学习算法已成为一种高效的学习方式。使用 AI 刷题具有多方面的优势,不仅能显著提升学习效率,还极大地改善了学习体验。在传统刷题过程中,往往需要花费大量时间查找资料、编写测试用例和手动调试代码,而 AI 则能够一站式完成这些繁琐的工作,让学习者将精力集中在理解算法本身,而不是被细节问题困扰。

AI 的互动性也为算法学习增添了趣味。通过与 AI 的交互,我们可以更主动地参与问题解决过程。同时,AI 可以模拟技术面试场景,为用户提供真实的练习体验,帮助更好地应对实际面试。此外,AI 支持多语言编程,用户可以在不同编程语言间切换,提高跨语言能力,还能尝试来自不同国家的竞赛题目,从而拓宽国际化视野。

总的来说,AI 刷题不仅代表了一种工具的进步,更是一种全新的学习方式。它在效率提升、思维拓展、个性化学习路径和资源丰富性等方面展现了无与伦比的优势。随着技术的进一步发展,这种学习方式必将广泛应用于编程学习和职业发展中。


使用豆包 MarsCode 辅助刷题

第 260 题,数字匹配问题 为例,以下说明如何使用 AI 辅助刷题。

数字匹配问题

问题描述

小 F 手中有一串数字,他希望这些数字能按照一定规则两两配对,具体规则如下:

  1. 配对中的两个数字差的绝对值必须大于等于给定的差异值 M
  2. 每个数字只能配对一次,不能重复使用。

小 F 想知道,在给定的数字中,最多能成功配对多少对。例如:

  • 输入数字 [1, 3, 3, 7] 和差异值 M = 2,最多可以配对两对:(1, 3)(3, 7)
测试样例

样例 1:
输入:N = 4, M = 2, X = [1, 3, 3, 7]
输出:2

样例 2:
输入:N = 5, M = 5, X = [10, 9, 5, 8, 7]
输出:1

样例 3:
输入:N = 6, M = 3, X = [2, 4, 6, 8, 10, 12]
输出:3


利用豆包 MarsCode 辅助解题

面对这样的题目,若一开始毫无头绪,可以向豆包 MarsCode 提出问题,如 “需要一点思路提示”。豆包会梳理出清晰的解题思路。

image.png

例如,它建议使用 排序双指针 方法解决问题,并提供如下代码:

#include <iostream>
#include <vector>
#include <algorithm>

int solution(int N, int M, std::vector<int> X) {
    std::sort(X.begin(), X.end());
    int count = 0, i = 0, j = 1;
    while (j < N) {
        if (X[j] - X[i] >= M) {
            count++;
            i++;
            j++;
        } else {
            j++;
        }
    }
    return count;
}

int main() {
    std::vector<int> arr1 = {1, 3, 3, 7};
    std::vector<int> arr2 = {10, 9, 5, 8, 7};
    std::vector<int> arr3 = {2, 4, 6, 8, 10, 12};

    std::cout << (solution(4, 2, arr1) == 2) << std::endl;
    std::cout << (solution(5, 5, arr2) == 1) << std::endl;
    std::cout << (solution(6, 3, arr3) == 3) << std::endl;
    return 0;
}

运行后发现,样例 3 无法通过。这表明 AI 的建议可能存在错误,但它仍提供了有用的分析。经提示分析,问题出在代码逻辑未能处理元素重复或匹配冲突的问题。此时,可以让豆包重新梳理思路。

image.png


解决问题的最终方法

根据豆包的分析和提示,可以改进为将数组排序后,按大小分为两部分,用双指针法匹配小的一部分和大的一部分。改进后的代码如下:

#include <iostream>
#include <vector>
#include <algorithm>

int solution(int N, int M, std::vector<int> X) {
    std::sort(X.begin(), X.end());
    int count = 0, i = 0, j = (N + 1) / 2;  
    while (i < N / 2 && j < N) {
        if (X[j] - X[i] >= M) {
            count++;
            i++;
            j++;
        } else {
            j++;
        }
    }
    return count;
}

int main() {
    std::vector<int> arr1 = {1, 3, 3, 7};
    std::vector<int> arr2 = {10, 9, 5, 8, 7};
    std::vector<int> arr3 = {2, 4, 6, 8, 10, 12};

    std::cout << (solution(4, 2, arr1) == 2) << std::endl;
    std::cout << (solution(5, 5, arr2) == 1) << std::endl;
    std::cout << (solution(6, 3, arr3) == 3) << std::endl;
    return 0;
}

修改后的代码成功通过了所有测试样例。这说明 AI 的建议虽然可能不完全正确,但其提供的思路和框架非常有帮助,最终通过人机协作解决了问题。


总结

使用 AI 辅助刷题能够快速提供思路和代码,实现高效的学习。尽管 AI 有时会出错,但其分析和提示仍具有重要价值。通过与 AI 的互动,我们不仅能提高解题效率,还能在学习中不断优化自己的思维方式。未来,AI 将在编程学习和职业发展中发挥越来越重要的作用。