0%

5.4面试+携程笔试

显然是似了

笔试问题:

  1. vue3 和 vue2 有什么区别
  2. JSON.stringify() 的作用
  3. localStorage、session、cookie的区别
  4. 简述 Vuex 的核心概念和作用
  5. null 和 undefined 的区别
  6. 给定一个字符串,找出其中出现次数最多的字符。
  7. 写一个函数将树形结构数据转化为平铺结构

面试被拷打了,包括但不限于:

  • 这个为什么要手写,这不就是一个很简单的组件吗
  • 有还是没有

感觉甚至不敢问面试评价,显然很糟糕

需要多一些面试和项目经验,得写写demo

携程笔试

四个编程题

  1. 给一个字符串,如果是大写字母的话,变为它的下一个字母,如 A 变成 B,Z 变成 A;如果是小写字母的话,变为它的前一个字母,如 z 变成 y,a 变成 z,其他字符不变。(秒了)

  2. 第一行输入 n,表示数据组数。接下来每一行为 字符串 + 值 的形式,从中选择两个字符串,使得其中一个是另一个的字串,同时使得两个值的和最大。(strstr(a,b) 函数用于查找 b 在 a 第一次出现的位置,过了 95%)

  3. 有一个字符串由 0、1、2 构成,但是其中的某几位不可知,以 ?代替,但是满足以下条件:

    • 相邻两个字符不相同;
    • 任意连续三个字符组成的三进制数必定是偶数

    思路:在三位三进制数中符合上述条件的只有:020(6)、101(10)、121(16)、202(20)

    所以自然按位数分两种情况讨论:

    • 一个是只有三位的情况,匹配上述四种情况的任意一种即可。
    • 另一个是大于三位的情况,词此时字符串只能是020202……或202020……才能满足条件。

    (过了 71%)

  4. 小明需要从编号为 1 的城市前往编号为 n 的城市,第一行输入 n,m,h,分别指代城市数、道路数、以及路程限制。
    接下来 m 行,每行输入 u,v,w,d,指代从 u 和 v 之间的路径,道路承重、路程。
    无法到达 n 输出 -1,在路程限制 h 的范围内,寻找车辆的最大承重。
    输入:

    3 3 5
    1 2 7 3
    1 2 6 4
    3 2 4 2
    

    输出: 6

    解释:从 1 到 3 可以有两条路,1→3 或 1→2→3,路程分别为 4 和 5,承重最大为 6 和 4,需要输出可承重的最大值,即 6。

    题解

    #include 
    #include 
    #include 
    #include 
    using namespace std;
    
    const int INF = 1e9;
    const int MAXN = 100005;
    
    struct Edge {
        int to;  // 目标节点编号
        int w;   // 边权值,即承重能力
        int d;   // 路径长度
        Edge(int _to, int _w, int _d) : to(_to), w(_w), d(_d) {}
    };
    
    vector graph[MAXN];  // 图的邻接表表示方式
    
    int n, m, h;
    int dis[MAXN];      // dis[i]表示到节点i的最大承重能力
    int weight[MAXN];   // weight[i]表示从起点到i节点经过的边权最大值
    
    void dijkstra() {
        priority_queue> pq;  // 大根堆,存储节点编号和最大承重能力
        memset(dis, -1, sizeof(dis));      // 初始时所有节点最大承重能力为-1
        pq.push({INF, 1});                  // 初始时路程限制为h,承重能力为INF
        dis[1] = INF;                       // 起点最大承重能力为INF
        weight[1] = INF;                    // 起点经过的边权最大值为INF
        while (!pq.empty()) {
            int u = pq.top().second;        // 取出最大承重能力的节点
            int d = pq.top().first;         // 当前节点的最大承重能力
            pq.pop();                       // 弹出当前节点
            if (d != dis[u]) continue;      // 当前节点已经被更新过了,不用再次更新
            for (int i = 0; i < graph[u].size(); i++) {   // 遍历当前节点的所有相邻节点
                Edge& e = graph[u][i];
                if (e.d <= h) {             // 路径长度小于等于h
                    int w = min(dis[u], e.w);   // 更新承重能力
                    if (w > dis[e.to]) {    // 可以更新最大承重能力
                        dis[e.to] = w;
                        weight[e.to] = e.w;
                        pq.push({w, e.to});
                    } else if (w == dis[e.to]) {    // 与当前路径承重能力相同,取较大的边权
                        weight[e.to] = max(weight[e.to], e.w);
                    }
                }
            }
            if (u == n) {                   // 到达n节点,直接输出结果
                cout << weight[n] << endl;
                return;
            }
        }
        cout << -1 << endl;                 // 无法到达n节点
    }
    
    int main() {
        cin >> n >> m >> h;
        for (int i = 0; i < m; i++) {
            int u, v, w, d;
            cin >> u >> v >> w >> d;
            graph[u].push_back(Edge(v, w, d));  // 添加有向边
            graph[v].push_back(Edge(u, w, d));  // 添加反向边,因为是无向图,所以需要正反两个方向都加上边
        }
        dijkstra();
        return 0;
    }