You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用JavaScript求解森林树木美学排列判定及砍树方案计数问题

实现思路

首先明确符合美学要求的树木排列为严格摆动数组:相邻元素高度交替上升/下降,不存在连续上升、连续下降、相邻高度相等的情况。
解决问题分三步:

  1. 封装独立的判断函数,校验任意数组是否符合摆动数组要求
  2. 优先校验原数组是否符合要求,符合直接返回0
  3. 遍历每个位置模拟砍树,生成新数组校验是否合法,统计合法方案数,没有合法方案返回-1
原代码问题

你提供的代码逻辑完全不符合需求:仅统计了原数组中不符合摆动规则的三元组数量,既没有判断原数组本身的合法性,也没有模拟砍树操作、统计砍树后的合法方案,因此输出结果完全错误。

正确实现代码
// 辅助函数:判断数组是否符合美学要求
function isBeauty(arr) {
    if (arr.length <= 1) return true
    if (arr[0] === arr[1]) return false
    // 记录上一组的升降趋势:1为上升,-1为下降
    let prevTrend = arr[1] > arr[0] ? 1 : -1
    for (let i = 2; i < arr.length; i++) {
        if (arr[i] === arr[i-1]) return false
        const currentTrend = arr[i] > arr[i-1] ? 1 : -1
        // 连续升降直接判定不合法
        if (currentTrend === prevTrend) return false
        prevTrend = currentTrend
    }
    return true
}

function solution(A) {
    // 原数组已经合法直接返回0
    if (isBeauty(A)) return 0
    let validCount = 0
    const len = A.length
    // 遍历每个位置模拟砍树
    for (let cutIdx = 0; cutIdx < len; cutIdx++) {
        // 生成砍掉当前位置后的新数组
        const newArr = A.slice(0, cutIdx).concat(A.slice(cutIdx + 1))
        if (isBeauty(newArr)) validCount++
    }
    // 没有合法方案返回-1,否则返回合法方案数
    return validCount === 0 ? -1 : validCount
}
测试用例验证
console.log(solution([3, 4, 5, 3, 7])) // 输出3,符合预期
console.log(solution([1, 2, 3, 4])) // 输出-1,符合预期
console.log(solution([1, 3, 1, 2])) // 输出0,符合预期
console.log(solution([1, 2, 3, 4, 2, 5])) // 输出-1,符合预期

内容的提问来源于stack exchange,提问作者SE.Edward

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 14:57:03