Hyperskill Java入门课程printCorners方法测试报错求助
二维数组角落元素打印问题排查
我在Hyperskill平台学习《Java入门》课程时,实现printCorners方法遇到测试错误:第8个测试用例中的第6个测试失败,答案错误。请帮忙检查代码并解决问题。
任务要求
实现printCorners方法,按从左到右、从上到下的顺序打印二维数组twoDimArray的所有角落元素,元素间用空格分隔。示例如下:
输入数组:
1 0 2 0 0 0 3 0 4打印结果:
1 2 3 4
注意必须始终打印4个角落,例如输入单列数组:
输入数组:
1 2 3打印结果:
1 1 3 3
我的代码
public class ArrayOperations { public static void printCorners(int[][] twoDimArray) { int n = 2; int[][] myTable = new int[n][n]; int cols = twoDimArray[0].length; if (cols == 1) { for (int i = 0; i < twoDimArray.length; i++) { if (i == 0) { myTable[0][0] = twoDimArray[i][0]; myTable[0][1] = twoDimArray[i][0]; myTable[1][0] = twoDimArray[i][0]; myTable[1][1] = twoDimArray[i][0]; } else if (i < twoDimArray.length - 1) { myTable[1][0] = twoDimArray[i][0]; myTable[1][1] = twoDimArray[i][0]; } } System.out.println(myTable[0][0] + " " + myTable[0][0]); System.out.println(myTable[1][0] + " " + myTable[1][1]); } else if (cols > 1) { for (int i = 0; i < twoDimArray.length; i++) { for (int j = 0; j < twoDimArray[i].length; j++) { if (i == 0 && j == 0) { myTable[0][0] = twoDimArray[i][j]; } else if (i == 0 && j == twoDimArray[i].length - 1) { myTable[0][1] = twoDimArray[i][j]; } else if (i == twoDimArray.length - 1 && j == 0) { myTable[1][0] = twoDimArray[i][j]; } else if (i == twoDimArray.length - 1 && j == twoDimArray[i].length - 1) { myTable[1][1] = twoDimArray[i][j]; } } } for (int i = 0; i < myTable.length; i++) { for (int j = 0; j < myTable[i].length; j++) { System.out.print(myTable[i][j] + " "); } System.out.println(); } } } }
问题分析与修复
你的代码存在几个关键问题:
- 单列数组处理逻辑错误:在
cols == 1分支中,循环里的else if (i < twoDimArray.length - 1)会把最后一行的元素错误覆盖成中间行的值,比如输入单列数组[1,2,3]时,循环到i=1(中间行)会把myTable[1][0]和myTable[1][1]改成2,而正确值应该是最后一行的3。 - 输出多余空格:在
cols > 1分支中,打印时每个元素后都加空格,导致每行末尾会多一个空格,可能不符合测试用例的格式要求。 - 逻辑冗余:没必要用
myTable存储四个角落元素,直接定位到目标位置打印即可,代码可大幅简化。
修复后的代码:
public class ArrayOperations { public static void printCorners(int[][] twoDimArray) { int rows = twoDimArray.length; int cols = twoDimArray[0].length; // 打印第一行的两个角落 System.out.println(twoDimArray[0][0] + " " + twoDimArray[0][cols - 1]); // 打印最后一行的两个角落 System.out.println(twoDimArray[rows - 1][0] + " " + twoDimArray[rows - 1][cols - 1]); } }
修复说明
- 直接获取数组的行数
rows和列数cols,无需额外数组存储。 - 当数组只有一列时,
twoDimArray[0][0]和twoDimArray[0][cols-1]是同一个值,自然满足重复打印的要求。 - 输出格式严格符合要求,每行两个元素用空格分隔,无多余空格。
内容的提问来源于stack exchange,提问作者Krystian Kowalczyk
相关产品推荐
相关产品推荐

