华为7.14机试回顾

    简单说一下大家可能会关注的考试要求相关的小问题:
1.考试过程中可以用草稿纸,可以上厕所(建议跑步来回)。
2.可以使用本地IDE,但是我在本地调试完发现粘贴不过来了,最后只能重新手动输入(浪费时间,第一次还输错了==!)
3.如果出现什么自己不好把握的问题,可以咨询答题页面下方的工作人员,回复很快的。
4.考试全程摄像头开启,屏幕共享,我在切换到IDE时还是被提醒了一次(不知为何,当时吓了一跳)
    考试题目
1.蜂巢形状的区域相连(M*N),输入中只有C(Clean)和P(Pollution)两种数据,要求输入未被污染的区域数量
    当时看到这个题第一反应就是dfs,本来准备这次考试用c来写,但是在写动态数组的时候脑子死活无响应,硬着头皮写了c++,由于好久都不编程了,很多东西都忘了,花了一个小时才调出来。
思路大概就是:所有的点只要是C就dfs一次,每次dfs过程中把能扩展到的C点都变成P,最后用res记录总共把多少片区域从C变成了P;这道题AC了
#include <iostream>
#include <vector>
#include <cstdio>
using namespace std;
void dfs(vector< vector<char> > & grid,int x,int y,int m, int n)
{
    if(x>=0 && x<m && y>=0 &&y<n)//没有出界
    {
        if(grid[x][y]=='C')
        {
            grid[x][y]='P';
            dfs(grid,x-1,y,m,n);//上
            dfs(grid,x-1,y+1,m,n);//右上
            dfs(grid,x,y+1,m,n);//右
            dfs(grid,x,y-1,m,n);//左
            dfs(grid,x+1,y-1,m,n);//左下
            dfs(grid,x+1,y,m,n);//下
        }
    }
}
int solve(vector< vector<char> >&grid)
{
    int res = 0;
    int m = grid.size(),n = grid[0].size();
    for(int i=0;i<m;i++)
    {
        for(int j=0;j<n;j++)
        {
            if(grid[i][j]=='C')
            {
                dfs(grid,i,j,m,n);
                res++;
            }
        }
    }
    return res;
}
int main()
{
    int m,n;//m行 ,n列
    cin>>m>>n;
    vector< vector<char> >hive;
    for(int i=0;i<m;i++)
    {
        vector<char> *a = new vector<char>();
        hive.push_back(*a);
        for(int j=0;j<n;j++)
        {
            char c;
            cin>>c;
            hive[i].push_back(c);
        }
    }
    cout<<solve(hive);
    return 0;
}
2.推箱子游戏,看到这个题目的时候,我脑海里第一画面是我初中拿着小灵通坐在灶坑边上玩推箱子游戏的场景。。。
题目大概是给一组长度为N的整数字符串,每个箱子最终的位置,要求是把所有箱子都从0推到最终位置,允许连续的箱子一起推,比如2,3,4号箱子都需要前进的话,推一次就可以,输出最少的推动次数。
我在纸上比划了半天,一开始想到的是分割,递归。但是题里给的N<100000;感觉不太行,就在纸上反复的画,最终想到一个办法,由于时间限制最终就调出来90%,没时间了交卷了就。
思路:题目里要求从0推到最终位置,我想的是把他们从最终位置推回来,而我在反复写最终位置的序列时,想到如果一个位置比它相邻位置大的话,那不论是单独推,还是同时推,总要多推那么一下才能把这个箱子归位,于是求出每个位置的差,然后把其中正的值都加起来,不就是需要的次数了么。而且一下子复杂度就下来了。
代码及其简单。
#include <stdio.h>
int main()
{
    int c;
    int a[100005]={ 0 };
    int b[100005]={ 0 };
    int i,j=1;
    while(scanf("%d",&c)!=EOF)
    {
        a[j] = c;
        j++;
        if(c<0 || c>100000)
        {
            printf("-1");
            return 0;
        }
    }
    for(i=1;i<100005;i++)
    {
        b[i] = a[i] - a[i-1];
    }
    int sum = 0;
    for(i=1;i<100005;i++)
    {
        if(b[i]>0)
        {
            sum += b[i];
        }
    }
    printf("%d",sum);
    return 0;
}
3.原谅我弱鸡的本质,只能帮你们回忆一下题了。
网络维护:在一个n个结点的网络中,每个结点i的吞吐量为2^i,由于缺电(可能是湾湾)需要关闭其中的k个结点,需要保证剩余结点仍能互通,输入就是n和k两个值,空格隔开,输出要求给出关闭的结点顺序,升序排列。n<100000好像是。
#互联网求职##学习路径#
全部评论
请问下楼主或做过第一题的兄弟们,如果输入4*4矩阵: C C P P P C P C P P P C C C C P 未污染的区域(相连的C)不应该是3块吗?楼主输出结果为2,我自己写了下程序,输出为3,是我理解错题意了?(我没投提前批)
3 回复 分享
发布于 2021-07-19 15:29
我第一题和你一样,但是不知道为什么会栈溢出,很懵逼
1 回复 分享
发布于 2021-07-15 15:36
第二题思路牛呀
1 回复 分享
发布于 2021-07-15 16:37
考试时候,是做完一题,才能看见下一题吗
1 回复 分享
发布于 2021-07-15 16:40
我也考了,请问多少分才能过啊,我收到了测评邮件算是过了机考吗?
1 回复 分享
发布于 2021-07-15 18:38
楼主请问一共多长时间啊
1 回复 分享
发布于 2021-07-16 00:26
请问你是几号投的?几号机试?😊
1 回复 分享
发布于 2021-07-16 13:43
请问一下楼主,能再详细描述一下第二题的题意吗,谢谢!“题目大概是给一组长度为N的整数字符串,每个箱子最终的位置,要求是把所有箱子都从0推到最终位置,允许连续的箱子一起推”,这里输入的是每个箱子的目标位置,那么初始位置是啥?还是可以每次随便挑一个箱子从0号位置开始推?
1 回复 分享
发布于 2021-07-16 17:21
请问下楼主,华为机试可以用matlab么?感谢感谢
1 回复 分享
发布于 2021-07-19 08:14
谢谢楼主,顶一波儿😀
点赞 回复 分享
发布于 2021-07-15 15:02
请问7.14是牛客还是时习知考的呀
点赞 回复 分享
发布于 2021-07-20 21:12
上海华为软测岗 17717370696
点赞 回复 分享
发布于 2021-07-20 21:18
想問下所有崗位的題目都是相同的嗎?是不是軟件相關的會比較難?
点赞 回复 分享
发布于 2021-07-28 03:40
第一题为什么走6个方向?可以解释下么?
点赞 回复 分享
发布于 2021-08-18 20:44
同14号题目,第一题可能5分钟不到,一次通过。第二题想了很久用了递归,有点像模拟推箱子的过程,找为零的index,然后继续往下分,直到完成任务。花了一个半小时,最终AC90%,我还以为必须要完全AC才有分,然后就拼命debug,最终也没搞定。第三题用了“排序”,以为要涉及到什么无向图的东西,整了好久提交,因为头文件少引用,编译出错,考试结束。机试做完,回顾了一遍,才发现第二题很简单,思路和楼主不同,但是代码逻辑类似。第三题也不难,因为题目比较特殊,直接找最大的节点,然后剩下就找它的连接点。
点赞 回复 分享
发布于 2021-09-18 22:41

相关推荐

评论
18
120
分享
牛客网
牛客企业服务