1. 转圈打印矩阵
2. 将正方形矩阵顺时针旋转90度
3. "之"字形打印矩阵
4. 找到无序数组中最小的k个数
1. 题目:给定一个整型矩阵,请按照转圈方式打印它。
例如:
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
打印:1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10
解法
void printMatrixCircle(vector<vector<int>>map)
{
int n = map.size(), m = map[0].size();
int c = 0;
int i = 0, j=0;
while (c <= n / 2) {
for (j = c; j < m - c; j++) {
cout << map[i][j]<<" ";
}
j--;
for (i = c+1; i < n-c; i++) {
cout << map[i][j]<<" ";
}
i--;
for (j = j - 1; j >= c; j--){
cout << map[i][j]<<" ";
}
j++;
for (i = i - 1; i >= c+1; i--){
cout << map[i][j]<<" ";
}
i++;
c++;
}
}
2. 题目:给定一个M*N的矩阵matrix,把这个矩阵调整成顺时针转动90度后的形式。
例如: 顺时针转动90度为:
1 2 3 4 13 9 5 1
5 6 7 8 14 10 6 2
9 10 11 12 15 11 7 3
13 14 15 16 16 12 8 4
解法:
void rotateEdge(vector<vector<int>>&map,int i,int j,int n,int m)
{
int times = m - j;
int tmp = 0;
for (int c = 0; c != times; c++) {
tmp = map[i][j + c];
map[i][j + c] = map[n-c][j];
map[n - c][j] = map[n][m-c];
map[n][m-c] = map[i+c][m];
map[i + c][m] = tmp;
}
}
void rotationMatrix(vector<vector<int>>&map) {
int n = map.size()-1, m = map[0].size()-1;
int i = 0, j = 0;
while (i < n) {
rotateEdge(map,i++,j++,n--,m--);
}
}
3. 题目:给定一个矩阵matrix,按照之字形的方式打印这个矩阵,例如
1 2 3 4
5 6 7 8
9 10 11 12
之字形打印的结果为:1,2,5,9,6,3,4,7,10,11,8,12
解法
void printLevel(vector<vector<int>>map, int i, int j, int x, int y, bool f)
{
if (f) {
while (i != x + 1)
cout << map[i++][j--] << " ";
}
else {
while (x != i - 1)
cout << map[x--][y++] << " ";
}
}
void printMatrixZigZag(vector<vector<int>>map)
{
int i = 0, j = 0, x = 0, y = 0;
int n = map.size() - 1, m = map[0].size() - 1;
bool fromUp = false;
while (i != n + 1) {
printLevel(map,i,j,x,y,fromUp);
i = j == m ? i + 1 : i;
j = j == m ? j : j + 1;
y = x == n ? y + 1 : y;
x = x == n ? x : x + 1;
fromUp = !fromUp;
}
cout << endl;
}

2733

被折叠的 条评论
为什么被折叠?



