面试题20:顺时针打印矩阵
题目:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。例如:如果输入以下矩阵:
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
则依次打印出数字1、2、3、4、5、6、7、8、9、10、11、12、13、14、15、16
1 void printMatrixClockwisely(vector< vector<int> >&numbers) 2 { 3 int m = numbers.size(); 4 if ( m == 0 ) 5 return ; 6 int n = numbers[0].size(); 7 if ( n == 0 ) 8 return ; 9 int leftTop = 0; 10 while (leftTop*2 < m && leftTop*2 < n) 11 { 12 //打印左上角元素为numbers[leftTop][leftTop]的元素 13 int endCol = n - 1 - leftTop; 14 int endRow = m - 1 -leftTop; 15 //从左到右打印一行 16 for (int j = leftTop; j <= endCol; ++j) 17 cout << numbers[leftTop][j] << ' '; 18 //从上到下打印一行 19 if (endRow > leftTop) 20 {//注意是两行,不能是两列 21 for (int i = leftTop+1; i <= endRow; ++i) 22 cout << numbers[i][endCol]<< ' '; 23 } 24 //从右到左打印一行 25 if (endRow > leftTop && endCol > leftTop ) 26 { 27 for (int j = endCol-1; j >= leftTop; --j) 28 cout << numbers[endRow][j]<< ' '; 29 } 30 //从下到上打印一行 31 if (endRow - 1 > leftTop && endCol > leftTop) 32 { 33 for (int i = endRow-1; i > leftTop; --i) 34 cout << numbers[i][leftTop]<< ' '; 35 } 36 leftTop++; 37 } 38 }
分析:该题主要有两个需要注意的地方(选取左上角(leftTop,leftTop)的一圈为分析目标):
- 循环终止条件。通过举例分析得出leftTop*2 < m && leftTop*2 < n为循环终止条件;
- 打印每一步的前提条件。第一步总是需要的。而第二步要求至少有两行,第三步打印的前提条件是圈内至少有两行两列,而第四步打印则要求至少有三行两列。