地平线编译器研发一面

首先跟我介绍了下,然后问了一下实习经历,最后就只问了三个题目
第一题:a+b不用四则运算实现

#include<bits/stdc++.h>

using namespace std;

typedef long long ll;

const ll inf=1e9+7;
const int N=1e6+5;

int main()
{
    int a, b;
    cin >> a >> b;
    int sum=a^b;
    b=(a&b)<<1;
    while(b)
    {
        int tmp=sum;
        sum=sum^b;
        b=(tmp&b)<<1;
    }
    cout << sum << endl;
    return 0;
}

第二题:矩阵的转置,空间复杂度为O(1)

#include<bits/stdc++.h>

using namespace std;

typedef long long ll;

const ll inf=1e9+7;
const int N=1e6+5;

int GetPre(int i,int n,int m)
{
    return (i%n)*m+i/n;
}

int GetNext(int i,int n,int m)
{
    return (i%m)*n+i/m;
}

bool check(int i,int n,int m,int v)
{
    i=GetNext(i,n,m);
    while(i!=v)
    {
        if(i<v)
        {
            return false;
        }
        i=GetNext(i,n,m);
    }
    return true;
}

void Loop(int * a,int i,int n,int m,int v)
{
    int tmp=a[i];
    while(GetPre(i,n,m)!=v)
    {
        a[i]=a[GetPre(i,n,m)];
        i=GetPre(i,n,m);
    }
    a[i]=tmp;
}

void ZhuanZhi(int* a,int n,int m)
{
    for(int i=0;i<n*m;i++)
    {
        if(check(i,n,m,i))
        {
            Loop(a,i,n,m,i);
        }
    }
}

int a[N];

int main()
{
    int n, m;
    scanf("%d%d",&n,&m);
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<m;j++)
        {
            scanf("%d",&a[i*m+j]);
        }
    }
    ZhuanZhi(a,n,m);
    for(int i=0;i<m;i++)
    {
        for(int j=0;j<n;j++)
        {
            printf("%d%c",a[i*n+j],j+1==n?'\n':' ');
        }
    }
    return 0;
}

第三题:实现Lca
大体框架,建树感觉有点麻烦

struct TreeNode
{
    int val;
    TreeNode * left;
    TreeNode * right;
    TreeNode():val(0),left(NULL),right(NULL){};
    TreeNode(int x):val(x),left(NULL),right(NULL){};
};

struct Tree
{
    TreeNode* root_;
    map<TreeNode*,TreeNode*> pa_;
    map<TreeNode*,int> dep_;
    Tree():root_(NULL){};
    void Dfs(TreeNode *v,TreeNode* f,int dep)
    {
        pa_[v]=f;
        dep_[v]=dep;
        if(v->left!=NULL)
        {
            Dfs(v->left,v,dep+1);
        }
        if(v->right!=NULL)
        {
            Dfs(v->right,v,dep+1);
        }
    }
    TreeNode * Lca(TreeNode *u,TreeNode *v)
    {
        while(dep_[u]>dep_[v])
        {
            u=pa_[u];
        }
        while(dep_[v]>dep_[u])
        {
            v=pa_[v];
        }
        if(u==v)
        {
            return u;
        }
        while(pa_[u]!=pa_[v])
        {
            u=pa_[u];
            v=pa_[v];
        }
        return pa_[u];
    }
};
全部评论
有点难度哦(・o・)
点赞 回复 分享
发布于 2023-03-17 19:17 江苏

相关推荐

服从性笔试吗,发这么多笔,现在还在发。
蟑螂恶霸zZ:傻 x 公司,发两次笔试,两次部门匹配挂,
投递金山WPS等公司10个岗位 >
点赞 评论 收藏
分享
勤奋努力的椰子这就开摆:美团骑手在美团工作没毛病
投递美团等公司10个岗位
点赞 评论 收藏
分享
我已成为0offer的糕手:别惯着,胆子都是练出来的,这里认怂了,那以后被裁应届被拖工资还敢抗争?
点赞 评论 收藏
分享
7 10 评论
分享
牛客网
牛客企业服务