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

Java数组单峰/单谷结构校验问题及错误代码排查

Java数组增减趋势判断问题排查与修复

问题需求

编写Java程序实现以下功能:

  • 先输入整数n,再输入n个整数组成数组
  • 判断是否存在i(i可以等于n),满足以下两种情况之一:
    1. 数组从首元素到第i个元素(索引i-1)非递减,从第i个元素到尾元素非递增
    2. 数组从首元素到第i个元素非递增,从第i个元素到尾元素非递减

示例:

  • 输入5及[1,2,5,3,1],输出Yes(i=3,符合先增后减)
  • 输入4及[1,2,5,9],输出Yes(i=4,全程非递减)
  • 输入7及[1,8,5,6,7,2,6],输出No(不满足任一情况)

原代码问题分析

你的代码始终输出No,核心问题在于逻辑结构和判断逻辑完全错误:

  1. 循环逻辑混乱:嵌套循环的设计完全偏离需求——通过内层j循环逐个检查前半段的元素对,每次检查都会重新遍历后半段并覆盖isConditionMet的值,最终只会保留最后一次循环的结果,而非判断是否存在任意一个符合条件的分割点i。
  2. 未考虑边界情况:需求中i可以等于n(即整个数组非递减或非递增),但原代码的i只遍历到n-1,漏掉了这种合法情况。
  3. 条件判断错误:检查后半段时,每次循环都会修改isConditionMet,只要最后一个元素对不符合就会设为false,但正确逻辑应该是只要有一个元素对不符合,就判定当前分割点i无效,而非覆盖最后结果。
  4. 初始化错误:isConditionMet初始设为true,但后续循环会覆盖这个值,导致初始状态无意义。

修正后的代码

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);

        System.out.println("enter n");
        int n = input.nextInt();
        int[] heights = new int[n];

        System.out.println("enter elements of your array");
        for (int i = 0; i < n; i++) {
            heights[i] = input.nextInt();
        }

        boolean isConditionMet = false;
        // 遍历所有可能的分割点i(0到n,包含n)
        for (int i = 0; i <= n; i++) {
            // 检查情况1:前半段非递减,后半段非递增
            boolean case1 = isNonDecreasing(heights, 0, i) && isNonIncreasing(heights, i, n);
            // 检查情况2:前半段非递增,后半段非递减
            boolean case2 = isNonIncreasing(heights, 0, i) && isNonDecreasing(heights, i, n);
            
            if (case1 || case2) {
                isConditionMet = true;
                break; // 找到符合条件的i,直接跳出循环
            }
        }

        System.out.println(isConditionMet ? "Yes" : "No");
        input.close();
    }

    // 判断数组从start到end(左闭右开)是否非递减
    private static boolean isNonDecreasing(int[] arr, int start, int end) {
        for (int i = start + 1; i < end; i++) {
            if (arr[i - 1] > arr[i]) {
                return false;
            }
        }
        return true;
    }

    // 判断数组从start到end(左闭右开)是否非递增
    private static boolean isNonIncreasing(int[] arr, int start, int end) {
        for (int i = start + 1; i < end; i++) {
            if (arr[i - 1] < arr[i]) {
                return false;
            }
        }
        return true;
    }
}

代码说明

  1. 辅助方法拆分:把非递减、非递增的判断逻辑拆成独立方法,代码更清晰,复用性更强。
  2. 遍历所有分割点:i从0到n遍历,包含i=n的情况(对应整个数组非递减/非递增)。
  3. 短路判断:只要找到任意一个符合条件的i,就立刻标记为true并跳出循环,避免不必要的计算。
  4. 边界处理:左闭右开的区间设计,比如isNonDecreasing(heights, 0, i)表示检查索引0到i-1的元素,符合需求中“首元素到第i个元素”的描述;当i=0时前半段为空,直接返回true;当i=n时后半段为空,直接返回true。

内容的提问来源于stack exchange,提问作者Linda

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 18:48:18