今晚华为笔试题解析
今天的题,难度一般,都是可以做的
1.旋转矩阵,顺时针90度旋转M次,其实就M%4值分类讨论一下就行
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
typedef long long LL;
const int maxn=15;
int a[maxn][maxn];
int b[maxn][maxn];
int n,m;
int main() {
cin>>n;
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
cin>>a[i][j];
}
}
cin>>m;
int t=m%4;
if(t==1){
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
b[i][j]=a[n-j-1][i];
}
}
}
else if(t==2){
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
b[i][j]=a[n-i-1][n-j-1];
}
}
}
else if(t==3){
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
b[i][j]=a[j][n-i-1];
}
}
}
else{
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
b[i][j]=a[i][j];
}
}
}
for(int i=0;i<n;i++){
for(int j=0;j<n-1;j++){
cout<<b[i][j]<<" ";
}
cout<<b[i][n-1]<<endl;
}
return 0;
} 2.组合数学,n件物品分法给k个人,当然也就能用dfs来做,本来想用组合数学的公式来算答案,然后dfs输出,其实也可以放一块进行。
这题其实有点问题,n=0 k=0的时候其实答案应该是0,用这个代码输出是1,但是它又说不考虑边界。有点弟弟。要不是灵机一动把特判去了,就被坑了。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
typedef long long LL;
const int maxn=15;
int n,k;
int ans=0;
int bj=0;
int a[maxn];
void dfs(int x,int res){
if(x>k){
if(res)
return;
ans++;
if(bj){
for(int i=1;i<=k;i++){
for(int j=1;j<=a[i];j++)
cout<<"*";
if(i!=k)
cout<<"|";
}
cout<<endl;
}
return;
}
for(int i=res;i>=0;i--){
a[x]=i;
dfs(x+1,res-i);
}
}
int main() {
cin>>n>>k;
dfs(1,n);
cout<<ans<<endl;
bj=1;
dfs(1,n);
return 0;
} 3.编辑距离模板题,虽然一看就可能tle超时,但是毕竟是华为出的题,从来不考虑复杂度,我就知道,所以一发就过,不亏是华为没辜负我的信任。 #include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
typedef long long LL;
const int maxn=10005;
int n,k;
string s[maxn];
int N;
int main() {
cin>>N;
long long ans=0;
for(int i=1;i<=2*N;i++)
cin>>s[i];
for(int k=1;k<=N;k++){
int n=s[k].length();
int m=s[N+k].length();
int dis[n+1][m+1];
for(int i=0;i<n+1;i++)
dis[i][0]=i;
for(int i=0;i<m+1;i++)
dis[0][i]=i;
for(int i=1;i<n+1;i++) {
for(int j=1;j<m+1;j++) {
if(s[k][i-1]==s[N+k][j-1]){
dis[i][j]=dis[i-1][j-1];
}else{
dis[i][j]=min(dis[i-1][j-1],min(dis[i-1][j],dis[i][j-1]))+1;
}
}
}
ans+=dis[n][m];
}
printf("%lld\n",ans);
return 0;
} #华为##笔试题目#

查看3道真题和解析