当前位置: 首页 > 面试经验 >

华为机试&面经c++

优质
小牛编辑
96浏览
2023-12-04

华为机试&面经c++

机试三道题

第一题:简单的数组题,具体内容忘了。只记得输出是类似“1 2 3”这样用空格隔开的一个个结果。我本来在循环中直接计算完每一个答案以后cout<<ans<<' '; 结果最后面多了一个空格答案不通过,无奈给最后一个结果单独输出。

第二题:最大拓扑网络。给定n个节点(0~n-1),每个节点都有其对应的层级(1<=level<=1000)。节点之间有链路连接,比如{0,2}表示节点0和节点2之间可以连接,这个连接是双向的。每个节点可以有多条链路,但只能属于一个层级。最大拓扑网络表示在同一层级下,能用链路直接连接起来的最大节点数量。(比如共有3个节点,节点0,1,2都属于层级1,且给定链路{0,1},{1,2},则它们组成了大小为3的拓扑网络。如果节点0,2属于层级1,节点1属于层级2,则最大拓扑网络大小为1)。

输入:n(代表n个节点)

n个数字(代表每个节点所属的层级)

m(代表共有m条链路)

m行,每行为两个数字(代表每条链路连接的两个节点)

输出:最大拓扑网络的大小

这道题我用广度搜素写的,测试用例增减了几条链路完全没问题,结果通过率只有10%,百思不得其解。贴一下代码希望有大佬解惑。

#include <vector>
#include <queue>
#include <iostream>
using namespace std;
int main()
{
    int n;
    cin >> n;
    vector<int> level;
    for (int i = 0; i < n; i++) {
        int l;
        cin >> l;
        level.push_back(l);
    }
    int linkNum;
    cin >> linkNum;
    vector<vector<int>> link(n);
    for (int i = 0; i < linkNum; i++) {
        int left, right;
        cin >> left >> right;
        link[left].push_back(right);
        link[right].push_back(left);
    }

    int ans = 1;
    queue<int> visit;
    for (int i = 0; i < n; i++) {
        if (level[i] == -1) { continue; }
        visit.push(i);
        int nowLevel = level[i];
        int size = 1;
        while (!visit.empty()) {
            int nowVisit = visit.front();
            level[nowVisit] = -1;
            for (auto it : link[nowVisit]) {
                if (level[it] == nowLevel) {
                    visit.push(it);
                    size++;
                }
            }
            visit.pop();
        }
        ans = max(ans, size);
    }
    cout << ans << endl;

第三题:菜单组合种类。为了科学饮食,控制每天摄入的卡路里数。最低值应不低于kcal_low, 最高值应不高于kcal_high。现在给出n个菜品的卡路里数,菜品可以重复选择。为满足总共摄入的卡路里数在规定的区间,可以有多少种菜品选择方式?

输入:kcal_low kcal_high

n

n行,表示每个菜品的卡路里数。

输出:所有合理的菜品组合方式数量。

例:输入350 500

3

100

200

500

输出:7

解释:500*1,200*2,200*1+100*2,200*2+100*1,100*4,100*3+200,100*5共7种选择。

完全背包问题,动态规划。代码没存。

----------------------------------------------------------------------------------------------------------------------------------

一面:开局经典自我介绍。然后让介绍一个代码量最多的项目,并且问了一些相关问题。

做题:输入hello world world

输出world 2

hello 1

按出现频次最多的单词排序。相同频次按字母表排序。哈希表解决。

之后问了一些c++八股文。后悔没好好背,答的磕磕绊绊。主要是面向对象相关,多态虚函数之类。还有指针和引用、内存等等。

二面:大体和一面内容差不多。八股+手撕代码。简历上每个项目都延申问了点相关知识,一路深入,直到我答不出来。但是面试官人很好,试出我的深浅之后就换话题,态度很友善类似闲聊,所以压力不大。

主管面:本来以为会压力面,结果还好。主管虽然比较严肃但没给太多压力。主要问了实习相关:碰到的最喜欢的人和最讨厌的人?遇到那些困难如何解决?如果重来一次实习有那些地方可以改进?实习收获?如何看待工作和学习的区别?介绍你认为最有效的学习方法?未来的职业规划?你认为作为技术专家/管理人员应该具备什么能力?最后问了华为企业文化的认识。总共30min。

 类似资料: