这是打印2d数组的反对角的代码,如果给定数组{{1,2,3}, {4,5,6}, {7,8,9}}
它应该返回
`{
{1},
{2,4},
{3,5,7},
{6,8},
{9}
}`
这是密码:
public static int[][] antiDiagonal(int [][]x){
int[][]res = new int[2*x.length-1][];
int s = 0;
for( int i = 0 ; i < res.length ; i++ ) {
if(i<= res.length/2)
s = i+1;
else
s = s -1;
res[i] = new int[s];
for( int j = i, r = 0 ; j >= 0 && r < res[i].length ; j-- ) {
if( (i-j) < x.length && j < x.length ){
res[i][r] = x[i-j][j] ;
r++;
}
}
}
return res;
}
我的大脑无法处理内部for循环的功能
for( int j = i, r = 0 ; j >= 0 && r < res[i].length ; j-- ) {
if( (i-j) < x.length && j < x.length ){
res[i][r] = x[i-j][j] ;
r++;
}
}
我只需要在我的理智堕落之前解释一下内部for循环实现了什么,你的回应将非常感谢。
我可以使用数组列表的替代解决方案,但问题的唯一目的是只使用二维数组。我已经理解了代码的所有部分,除了内部的for循环。
1条答案
按热度按时间gjmwrych1#
内部的for循环获取输入数组,沿对角线遍历它,并将每个对角线元素存储在新数组中。
i
是新数组的当前行,j
用于遍历输入数组并找到反对角元素,r
是新数组中当前列的索引j
从i
开始,每次迭代递减,而r
递增,这使得循环对角遍历输入数组:从最后一行/第一列到第一行/最后一列if
语句检查用于访问输入数组的索引是否在数组的边界内,如果在边界内,则在新数组中分配输入数组的相应值您可以尝试使用一个示例,并通过在每个步骤处停止来调试代码,以便更好地理解该过程。