生成零外框矩阵时原矩阵末尾元素丢失问题排查
问题诊断与修复
嘿,我一眼就揪出问题所在了——你的最后一个元素丢失,完全是因为内部嵌套循环的终止条件写错了!咱们一步步理清楚:
问题根源
看你最后用来填充原矩阵内容的嵌套循环:
for(int i=1,k=0;i<c3.length-1&&k<a.length;i++,k++)//i for the modified and k is the original { for(int j=1,l=0;j<c3[0].length&&l<a[0].length-1;j++,l++)//j for the modified and l is the original { c3[i][j]=a[k][l]; } }
这里有两个明显的错误:
l < a[0].length-1:这个条件会让l提前终止遍历,原矩阵的最后一列(索引a[0].length-1)的元素根本不会被复制到新矩阵里,这就是最后一个元素丢失的直接原因。j < c3[0].length:c3的最后一列已经被你用单独的循环设为'0'了,根本不需要往这个位置填充原矩阵的内容,所以j的上限应该是c3[0].length - 1(也就是到倒数第二列为止)。
修复后的完整代码
把嵌套循环的条件修正后,代码就能正常工作了:
public static char[][] Frame_of_zeros(char[][]a)//builds an external frame of zeroes { char[][]c3=new char[a.length+1][a[0].length+1]; // 填充左列的0 for(int i=0,j=0;i<c3.length;i++) { c3[i][j]='0'; } // 填充上行的0 for(int j=0,i=0;j<c3[0].length;j++) { c3[i][j]='0'; } // 填充下行的0 for(int i=c3.length-1,j=0;j<c3[0].length;j++) { c3[i][j]='0'; } // 填充右列的0 for(int i=0,j=c3[0].length-1;i<c3.length;i++) { c3[i][j]='0'; } // 填充原矩阵内容到中间区域 for(int i=1,k=0;i<c3.length-1;i++,k++)//i对应新矩阵,k对应原矩阵 { for(int j=1,l=0;j<c3[0].length-1&&l<a[0].length;j++,l++)//j对应新矩阵,l对应原矩阵 { c3[i][j]=a[k][l]; } } return c3; }
另外,外层循环的k < a.length其实是多余的——因为c3.length = a.length + 1,所以i < c3.length -1等价于k < a.length(i从1到a.length-1,对应k从0到a.length-1),删掉这个条件能让代码更简洁。
额外优化建议
你还可以把边框的填充逻辑合并成一个循环,减少重复代码,比如:
// 一次性填充所有边框的0 for(int i=0;i<c3.length;i++){ for(int j=0;j<c3[0].length;j++){ if(i==0 || i==c3.length-1 || j==0 || j==c3[0].length-1){ c3[i][j]='0'; } } }
这样代码更紧凑,也不容易出错~
内容的提问来源于stack exchange,提问作者user6394019
相关产品推荐
相关产品推荐

