题目描述
有一副由NxN矩阵表示的图像,这里每个像素用一个int表示,请编写一个算法,在不占用额外内存空间的情况下(即不使用缓存矩阵),将图像顺时针旋转90度。
给定一个NxN的矩阵,和矩阵的阶数N,请返回旋转后的NxN矩阵,保证N小于等于500,图像元素小于等于256。
测试样例:
python 代码
这次用到c语言的完全书写的时候遇到问题了,也就是int *a[10]和int (*a)[10]的问题,在传二位数组需要用int (*mat)[10]这种类型,我终于懂了,二位数组的列数必须已知
[[1,2,3],[4,5,6],[7,8,9]],3
返回:[[7,4,1],[8,5,2],[9,6,3]]
class Transform {
public:
vector<vector<int> > transformImage(vector<vector<int> > mat, int n) {
int i = 0;
int j = 0;
int temp;
for(i = 0;i<n;i++)
{
for(j = i;j<n;j++)
{
if(i != j)
{
temp = mat[i][j];
mat[i][j] = mat[j][i];
mat[j][i] = temp;
}
}
}
for(i = 0;i<n;i++)
for(j = 0;j<n/2;j++)
{
temp = mat[i][j];
mat[i][j] = mat[i][n-j-1];
mat[i][n-j-1]=temp;
}
return mat;
}
};
python 代码
#coding:utf-8
class Transform:
def transformImage(self,mat,n):
m = []
num = n
for i in range(n):
s = []
num = n
while num > 0:
s.append(mat[num-1][i])
num -= 1
m.append(s)
return m
if __name__ == '__main__':
mat = [[1,2,3],[4,5,6],[7,8,9]]
mytrans = Transform()
print mytrans.transformImage(mat,3)
题目描述
请编写一个算法,若MxN矩阵中某个元素为0,则将其所在的行与列清零。
给定一个MxN的int[][]矩阵(C++中为vector>)mat和矩阵的阶数n,请返回完成操作后的int[][]矩阵(C++中为vector>),保证n小于等于300,矩阵中的元素为int范围内。
测试样例:
[[1,2,3],[0,1,2],[0,0,1]]
返回:[[0,0,3],[0,0,0],[0,0,0]]
class Clearer {
public:
vector<vector<int> > clearZero(vector<vector<int> > mat, int n) {
int i = 0;
int j = 0;
int k = 0;
int a[300][300] = {0};
for(i = 0 ;i < n;i++)
for(j = 0;j < n;j++)
if(mat[i][j] == 0)
{
a[i][j] = 1;
}
for(i = 0 ;i < n;i++)
for(j = 0;j < n;j++)
if(a[i][j] == 1)
{
for(k = 0;k< n;k++)
{
mat[i][k] = 0;
mat[k][j] = 0;
}
}
return mat;
}
};
这次用到c语言的完全书写的时候遇到问题了,也就是int *a[10]和int (*a)[10]的问题,在传二位数组需要用int (*mat)[10]这种类型,我终于懂了,二位数组的列数必须已知
#include <stdio.h>
void clearZero(int (*mat)[3], int n) {
int i = 0;
int j = 0;
int k = 0;
int a[300][300] = {0};
for(i = 0 ;i < n;i++)
for(j = 0;j < n;j++)
if(mat[i][j] == 0)
{
a[i][j] = 1;
}
for(i = 0 ;i < n;i++)
for(j = 0;j < n;j++)
if(a[i][j] == 1)
{
for(k = 0;k< n;k++)
{
mat[i][k] = 0;
mat[k][j] = 0;
}
}
}
int main(int argc,char **argv[])
int mat[3][3]={{1,2,3},{0,1,2},{0,0,1}};
int i = 0;
int j = 0;
clearZero(mat,3);
for(i = 0 ;i < 3;i++)
{
for(j = 0;j < 3;j++)
printf("%d ",mat[i][j]);
printf("\n");
}
return 0;
}
区别int *a[10]和int (*a)[10]的代码
#include <stdio.h>
int main(int argc,char *argv[])
{
int i = 0;
int j = 0;
int a[6]={0,1,2,3,4,5};
int (*p)[5];
int *q[5];
q[1]=a;
//printf("%d\n",*q[0]);
//printf("%d\n",*q[1]);
//printf("%d\n",(*(q+1))[2]);
// printf("%d\n",(*q)[3]);
// printf("%d\n",(*q)[4]);
for(i = 0;i<6;i++)
printf("%d ",q[1][i]);
printf("\n");
/* p = &a;
for(i = 0; i <5 ;i++)
printf("%d ",*(*p+i));
printf("\n");
*/
return 0;
}