百度笔试题(矩阵相乘)
时间:09-14 09:31 阅读:1414次
*温馨提示:点击图片可以放大观看高清大图
简介:刚刚做完百度的笔试题,真心觉得不难,但由于时间不够所以没能全部写完,表示遗憾,笔试的最后一道我已经忘了原题,大概的意思是先将一个矩阵转置成另一个矩阵,然后两个矩阵相乘,最后返回二维数组,其实很简单。
看代码:
#include <iostream>
#include <vector>
#include <assert.h>
using namespace std;
void print_log(int **arr,int row,int line)
{
assert(arr);
for(int i=0; i<row; ++i)
{
for(int j=0; j<line; ++j)
cout<<arr[i][j]<<" ";
cout<<endl;
}
cout<<endl;
}
int** Fun(int value,int row,int line)
{
int **arr=new int*[row];
//申请二维数组
for(int i=0; i<row; ++i)
arr[i]=new int[line];
//构造初始二维数组
for(int i=0; i<row; ++i)
{
for(int j=0; j<line; ++j)
arr[i][j]=value++;
}
//显示初始二维数组
print_log(arr,row,line);
int **parr=new int*[row];
for(int i=0; i<row; ++i)
parr[i]=new int[line];
//转化数组
for(int i=0; i<row; ++i)
{
int k=0;
for(int j=0; j<line; ++j)
{
parr[i][j]=arr[k++][i];
}
}
//转化后输出
print_log(parr,row,line);
int **result=new int*[row];
for(int i=0; i<row; ++i)
result[i]=new int[line];
vector<int> v;
int x=0;
//矩阵相乘
for(int i=0; i<row; ++i,x++)
{
int m=0;
int y=0;
//相乘的次数
for(int n=0; n<row; ++n)
{
//每一行和另一个数组的每一列相乘后保存在vector中
for(int j=0; j<line; ++j)
{
v.push_back(arr[i][j] * parr[j][m]);
//v[s]=arr[i][j] * parr[j][m];
}
m++;
int sum=0;
int size=v.size();
//计算出行列相乘的的结果
for(int k=0; k<size; ++k)
sum+=v[k];
//释放vector数组
for(int k=0; k<size; ++k)
v.pop_back();
//保存到最后需要返回的二维数组里
result[x][y++]=sum;
}
}
print_log(result,row,line);
//释放空间
for(int i=row-1; i >=0; --i)
{
delete arr[i];
delete parr[i];
}
delete []arr;
delete []parr;
return result;
}
#include "head.h"
int main()
{
int value=0;
int row=0;
int line=0;
cout<<"请输入 value:";
cin>>value;
cout<<"请输入 row:";
cin>>row;
cout<<"请输入 line:";
cin>>line;
Fun(value,row,line);
return 0;
}
