v***o 发帖数: 287 | 1 Given a 2D matrix, print all elements of the given matrix in diagonal order.
For example, consider the following 5 X 4 input matrix.
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
17 18 19 20
Diagonal printing of the above matrix is
1
5 2
9 6 3
13 10 7 4
17 14 11 8
18 15 12
19 16
20 |
t*******y 发帖数: 22 | 2 void printDiagonal(const vector>& m){
assert(!m.empty() && !m[0].empty());
int rows = m.size();
int cols = m[0].size();
for(int i=0; i
int j=i;
for(int k=0; j>=0 && k < cols;++k,--j){
cout << m[j][k] << " ";
}
cout << endl;
}
} |
h*******e 发帖数: 1377 | 3 楼上你的逻辑在 i >= rows时候也对么
【在 t*******y 的大作中提到】 : void printDiagonal(const vector>& m){ : assert(!m.empty() && !m[0].empty()); : int rows = m.size(); : int cols = m[0].size(); : for(int i=0; i: int j=i; : for(int k=0; j>=0 && k < cols;++k,--j){ : cout << m[j][k] << " "; : } : cout << endl;
|
h****g 发帖数: 105 | 4 int m=matrix.size();
int n=matrix[0].size();
int i=0;
while(i
int j=0;
int a=i;
do{
cout<
} while(a>=0&&j
i++;
cout<
}
int j=1;
while(j
int i=m-1;
int b=j;
do{
cout<
} while(i>=0&&b
j++;
cout<
} |
t*******y 发帖数: 22 | 5 有bug,对最后一行特殊处理。
【在 h*******e 的大作中提到】 : 楼上你的逻辑在 i >= rows时候也对么
|
h*******e 发帖数: 1377 | 6 恩,就是k 和 j 的初值在最后一行第2个到最后的时候处理一下就好了,其他的写
得都还挺好。
【在 t*******y 的大作中提到】 : 有bug,对最后一行特殊处理。
|
t*******y 发帖数: 22 | 7 谢谢大牛夸奖
【在 h*******e 的大作中提到】 : 恩,就是k 和 j 的初值在最后一行第2个到最后的时候处理一下就好了,其他的写 : 得都还挺好。
|
h*******e 发帖数: 1377 | 8 哪有,我不是大牛哈。呵呵,大家一起互相学习, 一起讨论 一起提高么。
【在 t*******y 的大作中提到】 : 谢谢大牛夸奖
|
x*******e 发帖数: 84 | |
v***o 发帖数: 287 | 10 void diagonalOrder(int matrix[ROW][COL])
{
// There will be ROW+COL-1 lines in the output
for (int line=1; line<=(ROW + COL -1); line++)
{
/* Get column index of the first element in this line of output.
The index is 0 for first ROW lines and line - ROW for remaining
lines */
int start_col = max(0, line-ROW);
/* Get count of elements in this line. The count of elements is
equal to minimum of line number, COL-start_col and ROW */
int count = min(line, (COL-start_col), ROW);
/* Print elements of this line */
for (int j=0; j
printf("%5d ", matrix[min(ROW, line)-j-1][start_col+j]);
/* Ptint elements of next diagonal on next line */
printf("n");
}
}
order.
【在 v***o 的大作中提到】 : Given a 2D matrix, print all elements of the given matrix in diagonal order. : For example, consider the following 5 X 4 input matrix. : 1 2 3 4 : 5 6 7 8 : 9 10 11 12 : 13 14 15 16 : 17 18 19 20 : Diagonal printing of the above matrix is : 1 : 5 2
|
|
|
a******0 发帖数: 67 | 11 厉害,能不能讲讲您是怎么想到这个的,:-)
int count = min(line, (COL-start_col), ROW);
thanks
【在 v***o 的大作中提到】 : void diagonalOrder(int matrix[ROW][COL]) : { : // There will be ROW+COL-1 lines in the output : for (int line=1; line<=(ROW + COL -1); line++) : { : /* Get column index of the first element in this line of output. : The index is 0 for first ROW lines and line - ROW for remaining : lines */ : int start_col = max(0, line-ROW); : /* Get count of elements in this line. The count of elements is
|
w******e 发帖数: 1621 | 12 6x4的input应该排成啥样
1
2
3
4
4
4
3
2
1
么
7*4的input呢 |
c*******r 发帖数: 610 | |
w**********h 发帖数: 31 | 14 public static void diagonalMatrix(int[][] M){
int row=M.length; int col=M[0].length;
int diag_row=row+col-1;//# rows for the new diagonal matrix
int diag_col=Math.min(col,row);
int new_row=0,new_i=0,new_j=0;
for(int i=0;i
for (int j=0;j<=diag_col;j++){
new_row=row-j;//
new_i=i-j;new_j=j;
if(new_i<0){System.out.printf("\n");break;}
if(new_i>new_row-1) {new_i=new_row-1;new_j=i-new_i;}
if(new_j>col-1||new_i<0){System.out.printf("\n");break;}
System.out.printf(String.valueOf(M[new_i][new_j])+" ");
}
} |
a*****e 发帖数: 1700 | 15 这是一个很简洁的递归问题,为什么没有人给出这方面的解答?diag(X) 可以分解成:
diag(X) = combine(leftColumnOf(X), diag(RightColumnsOf(X)))
以下是用 Haskell 写的答案:
diag [] = []
diag ([]:xs) = [] : diag xs
diag a = [x] : comb l (diag r)
where
x:l = map head a
r = map tail a
comb [] s = s
comb x [] = [x]
comb (x:y) (s:r) = (x:s) : comb y r |
m****s 发帖数: 131 | 16 void printDigMatrix(int **m, int r, int c){
for(int i=0; i
int j;
if(i>=r){
j = i-r+1;
}
else j=0;
while(j<=i&&j
printf("%d ", m[i-j][j]);
j++;
}
printf("\n");
}
} |
v***o 发帖数: 287 | 17 Given a 2D matrix, print all elements of the given matrix in diagonal order.
For example, consider the following 5 X 4 input matrix.
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
17 18 19 20
Diagonal printing of the above matrix is
1
5 2
9 6 3
13 10 7 4
17 14 11 8
18 15 12
19 16
20 |
t*******y 发帖数: 22 | 18 void printDiagonal(const vector>& m){
assert(!m.empty() && !m[0].empty());
int rows = m.size();
int cols = m[0].size();
for(int i=0; i
int j=i;
for(int k=0; j>=0 && k < cols;++k,--j){
cout << m[j][k] << " ";
}
cout << endl;
}
} |
h*******e 发帖数: 1377 | 19 楼上你的逻辑在 i >= rows时候也对么
【在 t*******y 的大作中提到】 : void printDiagonal(const vector>& m){ : assert(!m.empty() && !m[0].empty()); : int rows = m.size(); : int cols = m[0].size(); : for(int i=0; i: int j=i; : for(int k=0; j>=0 && k < cols;++k,--j){ : cout << m[j][k] << " "; : } : cout << endl;
|
h****g 发帖数: 105 | 20 int m=matrix.size();
int n=matrix[0].size();
int i=0;
while(i
int j=0;
int a=i;
do{
cout<
} while(a>=0&&j
i++;
cout<
}
int j=1;
while(j
int i=m-1;
int b=j;
do{
cout<
} while(i>=0&&b
j++;
cout<
} |
|
|
t*******y 发帖数: 22 | 21 有bug,对最后一行特殊处理。
【在 h*******e 的大作中提到】 : 楼上你的逻辑在 i >= rows时候也对么
|
h*******e 发帖数: 1377 | 22 恩,就是k 和 j 的初值在最后一行第2个到最后的时候处理一下就好了,其他的写
得都还挺好。
【在 t*******y 的大作中提到】 : 有bug,对最后一行特殊处理。
|
t*******y 发帖数: 22 | 23 谢谢大牛夸奖
【在 h*******e 的大作中提到】 : 恩,就是k 和 j 的初值在最后一行第2个到最后的时候处理一下就好了,其他的写 : 得都还挺好。
|
h*******e 发帖数: 1377 | 24 哪有,我不是大牛哈。呵呵,大家一起互相学习, 一起讨论 一起提高么。
【在 t*******y 的大作中提到】 : 谢谢大牛夸奖
|
x*******e 发帖数: 84 | |
v***o 发帖数: 287 | 26 void diagonalOrder(int matrix[ROW][COL])
{
// There will be ROW+COL-1 lines in the output
for (int line=1; line<=(ROW + COL -1); line++)
{
/* Get column index of the first element in this line of output.
The index is 0 for first ROW lines and line - ROW for remaining
lines */
int start_col = max(0, line-ROW);
/* Get count of elements in this line. The count of elements is
equal to minimum of line number, COL-start_col and ROW */
int count = min(line, (COL-start_col), ROW);
/* Print elements of this line */
for (int j=0; j
printf("%5d ", matrix[min(ROW, line)-j-1][start_col+j]);
/* Ptint elements of next diagonal on next line */
printf("n");
}
}
order.
【在 v***o 的大作中提到】 : Given a 2D matrix, print all elements of the given matrix in diagonal order. : For example, consider the following 5 X 4 input matrix. : 1 2 3 4 : 5 6 7 8 : 9 10 11 12 : 13 14 15 16 : 17 18 19 20 : Diagonal printing of the above matrix is : 1 : 5 2
|
a******0 发帖数: 67 | 27 厉害,能不能讲讲您是怎么想到这个的,:-)
int count = min(line, (COL-start_col), ROW);
thanks
【在 v***o 的大作中提到】 : void diagonalOrder(int matrix[ROW][COL]) : { : // There will be ROW+COL-1 lines in the output : for (int line=1; line<=(ROW + COL -1); line++) : { : /* Get column index of the first element in this line of output. : The index is 0 for first ROW lines and line - ROW for remaining : lines */ : int start_col = max(0, line-ROW); : /* Get count of elements in this line. The count of elements is
|
w******e 发帖数: 1621 | 28 6x4的input应该排成啥样
1
2
3
4
4
4
3
2
1
么
7*4的input呢 |
c*******r 发帖数: 610 | |
w**********h 发帖数: 31 | 30 public static void diagonalMatrix(int[][] M){
int row=M.length; int col=M[0].length;
int diag_row=row+col-1;//# rows for the new diagonal matrix
int diag_col=Math.min(col,row);
int new_row=0,new_i=0,new_j=0;
for(int i=0;i
for (int j=0;j<=diag_col;j++){
new_row=row-j;//
new_i=i-j;new_j=j;
if(new_i<0){System.out.printf("\n");break;}
if(new_i>new_row-1) {new_i=new_row-1;new_j=i-new_i;}
if(new_j>col-1||new_i<0){System.out.printf("\n");break;}
System.out.printf(String.valueOf(M[new_i][new_j])+" ");
}
} |
|
|
a*****e 发帖数: 1700 | 31 这是一个很简洁的递归问题,为什么没有人给出这方面的解答?diag(X) 可以分解成:
diag(X) = combine(leftColumnOf(X), diag(RightColumnsOf(X)))
以下是用 Haskell 写的答案:
diag [] = []
diag ([]:xs) = [] : diag xs
diag a = [x] : comb l (diag r)
where
x:l = map head a
r = map tail a
comb [] s = s
comb x [] = [x]
comb (x:y) (s:r) = (x:s) : comb y r |
m****s 发帖数: 131 | 32 void printDigMatrix(int **m, int r, int c){
for(int i=0; i
int j;
if(i>=r){
j = i-r+1;
}
else j=0;
while(j<=i&&j
printf("%d ", m[i-j][j]);
j++;
}
printf("\n");
}
} |
f**********t 发帖数: 1001 | 33 for (int i = 0; i < row + col - 1; ++i) {
for (int x = min(i, row - 1), y = max(0, i - row + 1); 0 <= x && y
-x, ++y) {
cout << matrix[x][y] << 't';
}
cout << endl;
}
order.
【在 v***o 的大作中提到】 : Given a 2D matrix, print all elements of the given matrix in diagonal order. : For example, consider the following 5 X 4 input matrix. : 1 2 3 4 : 5 6 7 8 : 9 10 11 12 : 13 14 15 16 : 17 18 19 20 : Diagonal printing of the above matrix is : 1 : 5 2
|
z*********e 发帖数: 10149 | 34 int row = A.length;
if(row == 0) return;
int col = A[0].length;
for(int i = 0; i <= row + col - 2; i++){
for(int j = 0; j <= i; j++) {
if (i - j < row && j < col) System.out.print(A[i - j][j] + "
");
}
if( i != row + col - 2) System.out.println();
} |
w*****t 发帖数: 485 | 35 G电面还有个变体,要更复杂一些,输出成这个样子:
1 5 2 3 6 9 13 10 7 4 8 11 14 17 18 15 12 16 19 20
就是说每次的起点并不是在左侧或底部,而是一个连续的zigzag。 |