编写的最大代价算法始终返回0,遍历全集却仅输出0的原因排查
排查遍历数组返回最大代价却始终为0的问题
结合你给出的输入示例和代码片段,我梳理了几个最可能导致结果始终为0的原因,以及对应的排查方向:
1. 输入数据读取逻辑遗漏了标记处理
你的输入示例是3 4 P 2 4 3 2 9 6 9 13 3 8 E,其中P和E是起始/结束标记,但从你的代码片段来看,你只读取了row和col,之后直接开始处理数据——这会导致第一个要读取的是字符串P,而stdin.nextInt()会因为类型不匹配抛出异常(如果没捕获的话程序会崩溃),或者你用了错误的方式处理,最终导致gameBoard数组完全没有被赋值,保持初始的全0状态,那计算最大代价自然返回0。
修复建议:
读取完row和col后,先跳过P标记,再读取row*col个整数填充数组,最后跳过E标记:
// 跳过起始标记P stdin.next(); for (int i = 0; i < row; i++) { for (int j = 0; j < col; j++) { gameBoard[i][j] = stdin.nextInt(); } } // 跳过结束标记E stdin.next();
2. 最大代价的初始化或更新逻辑错误
如果数组已经被正确填充,但结果还是0,大概率是最大值计算环节出了问题:
- 比如你初始化
maxCost为0,但如果遍历的时候判断条件写反了(比如if (currentVal < maxCost)而不是>),就永远不会更新最大值; - 或者你根本没在遍历中更新
maxCost变量,直接返回了初始的0。
修复建议:
初始化maxCost时尽量用数组的第一个元素(避免数组全为负数的极端情况),然后遍历每个元素正确更新最大值:
int maxCost = gameBoard[0][0]; for (int[] rowArr : gameBoard) { for (int val : rowArr) { if (val > maxCost) { maxCost = val; } } }
3. 数组填充时的索引或循环逻辑错误
比如你创建了row*col的二维数组,但填充时循环次数不对,或者行/列索引搞反了,导致数组只有部分被赋值,剩下的还是0。如果输入的有效数值都比0小(虽然你的示例里是正数,但不排除其他测试用例),或者你刚好没遍历到有值的区域,结果也会是0。
排查方法:
在填充数组后,加一段代码打印整个数组的内容,确认所有元素都被正确赋值:
// 打印数组验证 for (int[] rowArr : gameBoard) { System.out.println(Arrays.toString(rowArr)); }
内容的提问来源于stack exchange,提问作者gwiz_kid
相关产品推荐
相关产品推荐

