今晚华为笔试题解析

今天的题,难度一般,都是可以做的
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;
}

#华为##笔试题目#
全部评论
“没辜负我的信任”这句笑死了😆
2 回复 分享
发布于 2020-03-07 19:50
很厉害!
点赞 回复 分享
发布于 2020-03-04 22:43
请问是什么岗
点赞 回复 分享
发布于 2020-03-06 21:35
请问下第三题题目是什么呀~
点赞 回复 分享
发布于 2020-03-10 00:58

相关推荐

评论
5
22
分享

创作者周榜

更多
牛客网
牛客企业服务