4.14 华为笔试题解

题目比较简单,一共三道题,leetcode medium难度。前两道题都全A了。第三道题是lc45,我A了95%,有一个用例没有通过,但是把code贴到lc是能过的。可能题目和原题还是不太一样吧。有懂的大佬可以说说这个用例是咋回事。

反转字符串

题目

将()中的字符串翻转,并在输出中删除括号。括号可迭代,如输入为 (uoy(love)i),输出为(iloveyou)。先翻转内层括号,再翻转外层括号。输出要删除掉所有括号。我感觉这题是今天最难的一题。。

code

思路为栈。用栈维护 '(' 的下标,遇到 ')' 出栈,并翻转之间的子串。
#include<bits/stdc++.h>
using namespace std;


void swap(char& a, char& b){
    char t = a;
    a = b;
    b = t;
}

void reverse(string& s, int l, int r){
    while(l<r)
    {
        swap(s[l], s[r]);
        l++;
        r--;
    }
}

string stringCore(string& s){
    int len = s.length();
    stack<int> leftP;
    string ret = "";
    for(int i=0;i<len;i++)
    {
        if(s[i]=='(')
            leftP.push(ret.size());
        else if(s[i]==')')
        {
            int l = leftP.top();
            leftP.pop();
            reverse(ret, l, ret.size()-1);
        }
        else{
            ret += s[i];
        }      
    }
    return ret;
}


int main(){
    //string s;
    //cin>>s;
    string s = "(((asdfg)asdfg)asdfg(asdfg)asdfg)asdfg(asdfghjkl)";
    cout<<stringCore(s)<<endl;
}

自动驾驶计速

题目

题目比较复杂,我这里就不写了。
大概是一个考验代码能力的设计类题目,需要注意的是AEB结束后的2s内是需要判断下一次AEB的。要点见注释。

code

#include<bits/stdc++.h>
using namespace std;

vector<int> uploadSpeeds(vector<int>& speed){
    vector<int> ret;
    int len = speed.size();
    
    int lastAEB = -1; //prevent repeating report
    int timer = 1; //normal timer
    int curAEB = 0; //the timer for AEB
    bool AEB = false; //is current AEB
    ret.push_back(speed[0]);
    for(int i=1;i<len;i++)
    {
        //在AEB状态下,单独处理
        if(AEB==true)
        {
            //判断AEB结束
            if(speed[i-1]-speed[i]<9)
            {
                for(int j=0;j<4;j++)
                    if(i+j<len)
                    {
                        ret.push_back(speed[i+j]);
                        //这里需要注意,在AEB结束的2s内是需要判断下一次AEB的
                        if(speed[i+j-1]-speed[i+j]>=9)
                            curAEB++;
                        else
                            curAEB==0;
                    }
                timer = 0;
                lastAEB = i+3;
                i += 3;
                AEB = false;
            }
            else{
                ret.push_back(speed[i]);
            }
        }
        //判断AEB开始
        else if(speed[i-1]-speed[i]>=9)
        {
            curAEB++;
            if(curAEB>=4){
                curAEB = 0;
                AEB = true;
                timer = 0;
                //找前四个点,看是不是比上一次的末尾大,推入
                for(int j=i-7;j<=i;j++)
                    if(j>lastAEB)
                        ret.push_back(speed[j]);
                
            }
        }
        else
            curAEB = 0;
        //正常计速
        if(timer==60&&!AEB)
        {
            timer = 0;
            ret.push_back(speed[i]);
        }
        timer++;
    }
    
    
    return ret;
}

int main(){
    int n;
    cin>>n;
    vector<int> speed(n);
    for(int i=0;i<n;i++)
    {
        cin>>speed[i];
    }
    vector<int> upload = uploadSpeeds(speed);
    int len = upload.size();
    for(int i =0;i<len-1;i++)
        cout<<upload[i]<<',';
    cout<<upload[len-1]<<endl;
}


跳跃游戏II

题目

见LC45。题目大概是一样的,可能有一个小小的区别,导致有1个样例我没有通过。但是我没有发现这个区别。

code

贪心算法。每次循环遍历当前位置到可达的最大位置,并更新下一次遍历的最大位置。
#include<bits/stdc++.h>
using namespace std;

int minTrans(vector<int>& dev){
    int ret = 0;
    int maxGet = 0;
    int pre = 0;
    while(maxGet<dev.size()-1)
    {
        int curGet = maxGet;
        for(int i=pre;i<=curGet;i++)
        {
            maxGet = max(maxGet, dev[i]+i);
        }
        ret++;
        pre = curGet+1;
    }

    return ret;
}

int main(){
    while(true){
        int n;
        cin>>n;
        vector<int> dev(n);
        for(int i=0;i<n;i++)
        {
            cin>>dev[i];
        }
        cout<<minTrans(dev)<<endl;
        }
}




#笔经##华为##C++工程师#
全部评论
跳跃游戏那是妥妥的动态规划问题。
点赞 回复 分享
发布于 2021-05-14 09:08
。。第二题过了60%,三个用例都能过。。不知道啥情况
点赞 回复 分享
发布于 2021-04-15 00:26
哎,第一题搞了半天没搞出来,笔试完回来一下就做出来了,还是自己太菜了
点赞 回复 分享
发布于 2021-04-14 23:21

相关推荐

03-27 16:40
已编辑
门头沟学院 C++
26学院本太难了,很多公司机筛就给我刷了。机会都难拿到如果是简历存在问题也欢迎拷打————————————————————分割线——————————————————————2026.3.4更新:发完贴之后,时不时投递又收到了不少的笔试/面试邀请。主要是之前投递简历出去之后基本上都是沉默状态,年后好转了不少timeline:2026.01.21&nbsp;文远知行笔试,半年多没刷算法题&nbsp;-&gt;挂&nbsp;(后续HR说春招可以重新安排笔试)2026.2.4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;小鹏汇天&nbsp;技术一面,第二周收到结果&nbsp;-&gt;挂2026.2.12&nbsp;&nbsp;&nbsp;大众Cariad代招&nbsp;技术二面&nbsp;-&gt;Offer2026.2.28&nbsp;&nbsp;&nbsp;多益网络技术面试,由于风评太差,一直在犹豫要不要接面试&nbsp;-&gt;推迟-----------分割线-----------2026.3&nbsp;月前的某一天,临时去电网报名了二批计算机岗位的笔试2026.3.6&nbsp;从上家公司实习离职,氛围最好的一家公司,leader&nbsp;说可以帮忙转正,但是流程太长,而且我们部门据说只有一个&nbsp;hc,更想要研究生,我很有可能是会被签外包公司在这里干活,就离职了。2026.3.9&nbsp;入职新公司,大众Cariad&nbsp;以外部公司的身份进组,项目组签了三年,后续三年应该都可以在这里呆,不知道有没有希望原地跳槽。2026.3.10&nbsp;电网考试居然说我通过资格审查了,短信约我去参加资格审查,请假一天,买了&nbsp;12&nbsp;号晚上的机票回成都2026.3.15&nbsp;参加国家电网计算机类笔试2026.3.17&nbsp;电网出成绩了,感觉很低。觉得已经🈚️了2026.3.18&nbsp;收到电网面试通知,通知&nbsp;3.22-3.25&nbsp;这个时间去面试,我的岗位只招&nbsp;1&nbsp;个人。据说面试只有&nbsp;2-3&nbsp;人,不知道能不能成功----------分割线-----------2026.3.21&nbsp;电网面试结束,感觉回答的还勉勉强强,大概是2个岗位分别招1个人,一共11人面试,实际来了9人2026.3.27&nbsp;出面试成绩,满分100分,早上10:20左右发现面试成绩46,我震惊了,没截图,后面过了十分钟重新看发现面试成绩给我改成58了。但同样震惊。朋友问我是不是把面试官打了,哈哈
点赞 评论 收藏
分享
评论
7
44
分享

创作者周榜

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