AI 代码陪练体验

294 阅读3分钟

今天浏览掘金的时候无意中发现顶部有个 AI辅助刷题的功能,所以就来尝试了一下。支持的语言比较丰富,主流的除了php基本都有,还有个debug功能,目测类似IDE里的调试工具,目前还在研究中,大家可以自己尝试尝试。

image.png

题目看着都不简单,刷习惯了leetcode的话看这边的题目需要适应一下,我调了一个寻找最大数的题目,题目描述比较好理解,不过我看它是支持导入自定义的题目的,这点比较人性化了,大家可以把喜欢的题库导入进来配合AI提示刷刷题。

image.png

最后附上我昨的题目和答案:

问题描述

对于一个有 N 个元素的数组,包含如下的元素 a1, a2, ..., an,我们定义了两个函数:

  • L(i) = j 需要满足的条件如下:

    • j < i
    • a[j] > a[i]
    • 如果找不到 j 的话,那么 L(i) = 0;如果有多个 j 的话,选择离 i 最近的那一个
  • R(i) = k 需要满足的条件如下:

    • k > i
    • a[k] > a[i]
    • 如果找不到 k 的话,那么 R(i) = 0;如果有多个 k 的话,选择离 i 最近的那一个

最后,我们定义 MAX(i) = L(i) * R(i),我们需要找到 MAX(i) 的最大值,其中 1 <= i <= N。

输入格式

总共有两行,第一行是数组长度 N,第二个是空格分割的所有数组的内容。

输出格式

输出 MAX(i) 的最大值。

输入样例

5
5 4 3 4 5

输出样例

8

解释说明

  • L(1) = 0,所以 MAX(1) = 0
  • L(2) = 1, R(2) = 5,所以 MAX(2) = 1 * 5 = 5
  • L(3) = 2, R(3) = 4,所以 MAX(3) = 2 * 4 = 8
  • L(4) = 1, R(4) = 5,所以 MAX(4) = 1 * 5 = 5
  • R(5) = 0,所以 MAX(5) = 0

数据范围

  • 1<=N<=1051 <= N <= 10^5
  • 1<=a[i]<=1091 <= a[i] <= 10^9

答案:

function solution(N, array) {
    // 步骤1:计算 L(i)  
    const L = new Array(N).fill(0); // 创建数组 L 并初始化为 0  
    const stackL = []; // 创建栈用于存放索引  

    // 从左到右遍历数组  
    for (let i = 0; i < N; i++) {
        // 维护栈,找出满足条件的最近的 j  
        while (stackL.length && array[stackL[stackL.length - 1]] <= array[i]) {
            stackL.pop(); // 弹出不符合条件的索引  
        }
        // 如果栈不为空,则取栈顶元素,计算 L(i)  
        if (stackL.length) {
            L[i] = stackL[stackL.length - 1] + 1; // +1 转换为 1-based 索引  
        } else {
            L[i] = 0; // 找不到符合条件的 j  
        }
        stackL.push(i); // 将当前索引压入栈中  
    }

    // 步骤2:计算 R(i)  
    const R = new Array(N).fill(0); // 创建数组 R 并初始化为 0  
    const stackR = []; // 创建栈用于存放索引  

    // 从右到左遍历数组  
    for (let i = N - 1; i >= 0; i--) {
        // 维护栈,找出满足条件的最近的 k  
        while (stackR.length && array[stackR[stackR.length - 1]] <= array[i]) {
            stackR.pop(); // 弹出不符合条件的索引  
        }
        // 如果栈不为空,则取栈顶元素,计算 R(i)  
        if (stackR.length) {
            R[i] = stackR[stackR.length - 1] + 1; // +1 转换为 1-based 索引  
        } else {
            R[i] = 0; // 找不到符合条件的 k  
        }
        stackR.push(i); // 将当前索引压入栈中  
    }

    // 步骤3:计算 MAX(i)  
    let maxProduct = 0; // 初始化最大乘积  
    for (let i = 0; i < N; i++) {
        maxProduct = Math.max(maxProduct, L[i] * R[i]); // 更新最大乘积  
    }

    return maxProduct; // 返回最大乘积  
}
function main() {
    // Add your test cases here
    console.log(solution(5, [5, 4, 3, 4, 5]) === 8);
}
main();