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

如何不创建新数组且不使用索引,用递归反转整数数组?

问题分析与解决方案

核心问题拆解

  • 递归状态丢失:你每次调用Problem5都会把end重置为数组长度,导致递归过程中无法保留上一次的end值——这是因为你没有把beginning和end作为递归参数传递,而是用了成员变量或者方法内重复初始化的方式。
  • 数组越界:数组索引从0开始,myArray.length是元素总数,最后一个有效索引是myArray.length - 1。你初始把end设为myArray.length,直接访问myArray[end]必然触发ArrayIndexOutOfBoundsException。

修复后的代码

public int[] Problem5(int[] myArray) {
    // 提前处理空数组或无需交换的情况
    if (myArray == null || myArray.length <= 1) {
        return myArray;
    }
    // 调用递归方法,初始化起始索引和末尾有效索引
    return problem5Recursive(myArray, 0, myArray.length - 1);
}

// 私有递归方法,传递当前的边界参数
private int[] problem5Recursive(int[] myArray, int begin, int end) {
    // 终止条件:当左右边界相遇或交叉时,交换完成
    if (begin >= end) {
        return myArray;
    }
    // 交换当前左右边界的元素
    int temp = myArray[begin];
    myArray[begin] = myArray[end];
    myArray[end] = temp;
    // 递归缩小边界范围
    return problem5Recursive(myArray, begin + 1, end - 1);
}

关键修复点说明

  1. 用重载方法分离逻辑:公共方法负责处理参数校验和递归初始化,私有递归方法专注于每一步的交换和状态传递,彻底解决了end被重复重置的问题。
  2. 修正索引边界:初始end设为myArray.length - 1,确保访问的是有效数组索引;终止条件begin >= end保证交换到数组中间时自动停止,从根源避免越界。
  3. 增加边界判断:提前过滤空数组、长度为0或1的数组,避免无意义的递归调用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 18:18:13