今晚华为笔试题解析
今天的题,难度一般,都是可以做的
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; }
#华为##笔试题目#