Java股票买卖算法运行抛出IndexOutOfBoundsException异常如何解决
错误原因
- 核心问题是循环内的三个
if判断是并行执行没有互斥,触发前一个if修改flag状态后,后续的if仍会判断执行,导致生成了只有买入日期、没有卖出日期的无效交易记录,最终打印时调用get(1)访问第二个元素触发下标越界。 - 具体到你提供的测试用例执行流程:当
i=6(最后一个元素下标)时:- 第一个
if判断满足(是最后一天且持有股票),执行添加卖出日期,将flag改为0 - 第二个
if判断也满足(flag已变为0且当日价格高于前一天),会额外新增一条只有买入日期的交易记录 - 这条新记录没有对应的卖出日期,后续打印调用
get(1)时就会抛出越界异常
- 第一个
修复方案
将并行的if改为互斥的if-else if结构,确保每轮循环只执行一个分支,同时补充边界逻辑:
import java.util.*; class stockbuysell{ //Function to find the days of buying and selling stock for max profit. public static void main(String []args){ int A[] = {100,180,260,310,40,535,695}; ArrayList<ArrayList<Integer>> al = stockBuySell(A,7); } static ArrayList<ArrayList<Integer> > stockBuySell(int A[], int n) { ArrayList<ArrayList<Integer>> al = new ArrayList<ArrayList<Integer>>(); if(n <= 1) return al; // 不足两天没有交易可能 int flag = 0; int idx = 0; for(int i=1;i<n;i++){ if(i==n-1 && flag==1){ // 最后一天仍持有,直接卖出 al.get(idx).add(i); flag = 0; idx++; } else if(flag == 0 && A[i]>A[i-1]){ // 未持有且价格上涨,买入 al.add(new ArrayList<Integer>()); al.get(idx).add(i-1); flag = 1; } else if(flag == 1 && A[i]<A[i-1]){ // 持有且价格下跌,卖出 al.get(idx).add(i-1); flag = 0; idx++; } } for(int i=0;i<al.size();i++){ System.out.println("买入日:"+al.get(i).get(0)+" 卖出日:"+al.get(i).get(1)); } return al; } }
修复后运行输出为:
买入日:0 卖出日:3 买入日:4 卖出日:6
符合测试用例的最大利润交易逻辑。
内容的提问来源于stack exchange,提问作者Pavan venkata sai
相关产品推荐
相关产品推荐

