基于锯齿数组打印Happy图案:代码输出不符预期求助
问题排查:锯齿数组绘制Happy图案失败
给定用于标记每行*位置的锯齿数组,你的代码无法输出预期的Happy图案,核心问题有三个:
- 遗漏首行首位置的
*:原代码从第二个元素开始处理空格后才输出*,直接跳过了第一个标记位(0)。 - 遗漏每行末尾的
*:内层循环j < arr[i].length - 1的条件,导致每行最后一个标记元素被排除,没输出对应的*。 - 空格逻辑有漏洞:仅处理两个
*之间的空格,虽然首位置是0没暴露问题,但如果首位置不是0,行首到第一个*的空格会完全缺失。
修正后的代码
int arr[][] = {{0,4,8,12,13,14,15,18,19,20,21,24,28}, {0,4,7,9,12,16,18,22,25,27}, {0,1,2,3,4,6,10,12,16,18,22,26}, {0,4,6,10,12,13,14,15,18,19,20,21,26}, {0,4,6,7,8,9,10,12,18,26}, {0,4,6,10,12,18,26}}; // 计算最大列号,确保所有行输出长度一致,图案不会错位 int maxColumn = 0; for (int[] row : arr) { int lastPos = row[row.length - 1]; if (lastPos > maxColumn) { maxColumn = lastPos; } } for (int i = 0; i < arr.length; i++) { int markerIndex = 0; // 逐列遍历到最大列号,逐个位置判断是否输出* for (int col = 0; col <= maxColumn; col++) { if (markerIndex < arr[i].length && col == arr[i][markerIndex]) { System.out.print("*"); markerIndex++; } else { System.out.print(" "); } } System.out.println(); }
修正思路说明
- 先获取所有标记中的最大列号,保证每行输出的字符数相同,避免图案各行长度不一导致错位。
- 逐列遍历每行的每个位置,直接判断当前列是否是该行需要标记的位置:
- 匹配则输出
*,同时移动标记数组的指针到下一个待匹配位置。 - 不匹配则输出空格。
- 匹配则输出
- 这种逻辑完全覆盖了所有标记位置,不管是行首、中间还是行尾的
*都能准确输出,也能正确填充所有需要的空格。
内容的提问来源于stack exchange,提问作者JASON REINFRED REYES
相关产品推荐
相关产品推荐

