阿里笔试8月2日题解

A. 给一个地图。可以上下左右走,每个点有一个超时时间,超过以后不能走了。问能否到达终点。

bfs模板题,唯一要注意的就是在队列中多存一个时间,然后走的时候判定下是不是已经超时不能走了。轻松拿下。

/*
 * @Author: your name
 * @Date: 2021-08-02 18:25:54
 * @LastEditTime: 2021-08-02 19:24:07
 * @LastEditors: Please set LastEditors
 * @Description: In User Settings Edit
 * @FilePath: \cpp\a.cpp
 */
#include<bits/stdc++.h>
using namespace std;
#define maxn 105
int tab[maxn][maxn],bx,by;
bool ispass[maxn][maxn];
int n,m;
bool islegal(int x,int y)
{
    return 0<=x&&x<n&&0<=y&&y<m;
}
const int dir[4][2]={{1,0},{0,1},{-1,0},{0,-1}};
struct point
{
    int x,y,time;
};
bool bfs(int bx,int by)
{
    queue<point> que;
    que.push({bx,by,0});
    ispass[bx][by]=1;
    while (que.size())
    {
        auto p=que.front();
        if (p.x==n-1&&p.y==m-1)
        {
            return true;
        }
        for (auto &e:dir)
        {
            point p2={p.x+e[0],p.y+e[1],p.time+1};
            if (islegal(p2.x,p2.y)&&tab[p2.x][p2.y]>=p2.time&&!ispass[p2.x][p2.y])
            {
                ispass[p2.x][p2.y]=true;
                que.push(p2);
            }
        }
        que.pop();
    }
    return false;
}
int main(void)
{
    int t;
    scanf("%d",&t);
    while (t--)
    {
        scanf("%d%d",&n,&m);
        memset(ispass,0,sizeof(ispass));
        for (int i=0;i<n;++i)
        {
            for (int j=0;j<m;++j)
            {
                scanf("%d",&tab[i][j]);
                if (tab[i][j]==0)
                {
                    bx=i,by=j;
                }
            }
        }
        auto ans=bfs(bx,by);
        puts(ans?"YES":"NO");
    }
    return 0;
}



B.  给一个数组,要求将其重排,使其重排后按顺序插入一个二叉排序树,插入完毕后能形成一颗完全二叉树。

考察对树的理解。对于完全二叉树,先从左到右,然后从上到下编号成1..n。如果按这个顺序插入,就能保证最后形成的一定是完全二叉树。
因此,我们只要保证,第i次插入的数字,刚好是完全二叉树中第i个数字即可。

我们首先将数字排序。然后对完全二叉树中序遍历,中序遍历的过程中记录当前点的标号是哪一个。由于中序遍历是从小到大,我们之前排序好的数字也是从小到大,因此可以利用这个关系,第i个中序遍历到的数字,就是数组排序后的第i个元素,其标号是j,那么设一个新的数组ar2,在中序遍历中执行ar2[j]=ar[i]的复制操作即可。

最后按顺序输出ar2中的数字即可。

/*
 * @Author: your name
 * @Date: 2021-08-02 18:25:54
 * @LastEditTime: 2021-08-02 19:45:29
 * @LastEditors: Please set LastEditors
 * @Description: In User Settings Edit
 * @FilePath: \cpp\b.cpp
 */
#include<bits/stdc++.h>
using namespace std;
#define maxn 100005
int ar[maxn],ar2[maxn];
vector<int> no;
void tree(int p,int n)
{
    if (p>n)
        return;
    tree(2*p,n);
    no.push_back(p);
    tree(2*p+1,n);
}
int main(void)
{
    int t;
    scanf("%d",&t);
    while (t--)
    {
        int n;
        no.clear();
        scanf("%d",&n);
        for (int i=0;i<n;++i)
        {
            scanf("%d",&ar[i]);
        }
        tree(1,n);
        sort(ar,ar+n);
        for (int i=0;i<n;++i)
        {
            ar2[no[i]-1]=ar[i];
        }
        for (int i=0;i<n;++i)
        {
            printf("%d ",ar2[i]);
        }
        puts("");
    }
    return 0;
}

#阿里巴巴笔试##笔经##阿里巴巴##笔试题目#
全部评论
看了一眼,第一题跟我的答案感觉只有python和c++的区别,为什么我过不了呢。。。。。
1 回复 分享
发布于 2021-08-02 21:57
感谢楼主,第一题能附加个dfs的题解吗
点赞 回复 分享
发布于 2021-08-10 14:15
谢谢楼主分享, 代码跟我一样, 可惜我是 Python 选手🤣
点赞 回复 分享
发布于 2021-08-03 14:32
感谢楼主分享!offer多多
点赞 回复 分享
发布于 2021-08-03 12:13
已码,早日offer!
点赞 回复 分享
发布于 2021-08-03 12:11
感谢大佬分享,祝早日offer!
点赞 回复 分享
发布于 2021-08-03 12:10
阿里笔试多长时间啊?
点赞 回复 分享
发布于 2021-08-03 09:44
一题没A,哭了
点赞 回复 分享
发布于 2021-08-03 08:20
只A了一个,T2写太慢了,模板该再打熟点。
点赞 回复 分享
发布于 2021-08-02 21:24

相关推荐

真tmd的恶心,1.面试开始先说我讲简历讲得不好,要怎样讲怎样讲,先讲背景,再讲技术,然后再讲提升多少多少,一顿说教。2.接着讲项目,我先把背景讲完,开始讲重点,面试官立即打断说讲一下重点,无语。3.接着聊到了项目的对比学习的正样本采样,说我正样本采样是错的,我解释了十几分钟,还是说我错的,我在上一家实习用这个方法能work,并经过市场的检验,并且是顶会论文的复现,再怎么不对也不可能是错的。4.面试官,说都没说面试结束就退出会议,把面试者晾在会议里面,丝毫不尊重面试者难受的点:1.一开始是讲得不好是欣然接受的,毕竟是学习。2.我按照面试官的要求,先讲背景,再讲技术。当我讲完背景再讲技术的时候(甚至已经开始蹦出了几个技术名词),凭什么打断我说讲重点,是不能听出人家重点开始了?这也能理解,每个人都有犯错,我也没放心上。3.我自己做过的项目,我了解得肯定比他多,他这样贬低我做过的项目,说我的工作是错误的,作为一个技术人员,我是完全不能接受的,因此我就和他解释,但无论怎么解释都说我错。凭什么,作为面试官自己不了解相关技术,别人用这个方式work,凭什么还认为这个方法是错的,不接受面试者的解释。4.这个无可厚非,作为面试官,不打招呼就退出会议,把面试者晾着,本身就是有问题。综上所述,我现在不觉得第一第二点也是我的问题,面试官有很大的问题,就是专门恶心人的,总结面试官说教,不尊重面试者,打击面试者,不接受好的面试者,技术一般的守旧固执分子。有这种人部门有这种人怎么发展啊。最后去查了一下,岗位关闭了。也有可能是招到人了来恶心人的,但是也很cs
牛客20646354...:招黑奴啊,算法工程师一天200?
点赞 评论 收藏
分享
评论
10
42
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务