虾皮笔试 虾皮笔试题 0401

笔试时间:2024年04月01日

历史笔试传送门:2023秋招笔试合集

第一题

题目:二叉树的层序遍历

给定数值无重复的二叉树的前序和中序遍历结果数组,输出此二叉树的层序遍历结果的数组。

样例输入

[1,2,3,4,5],[2,1,4,3,5]

样例输出

[1,2,3,4,5]

参考题解

前序遍历的第一个数字是根节点,找到它在中序遍历结果的索引,根据索引分成左右两个子树,之后递归即可。最后,再层序遍历返回数组。

C++:[此代码未进行大量数据的测试,仅供参考]

class Solution {
public:
    /**
     * Note: 类名、方法名、参数名已经指定,请勿修改
     *
     * 
     * 层序打印二叉树
     * @param pre int整型 vector 前序遍历数组
     * @param mid int整型 vector 中序遍历数组
     * @return int整型vector
     */
    struct Node {
        int val;
        Node* left, *right;
        Node(int x = 0, Node* l = nullptr, Node* r = nullptr) {
            val = x, left = l, right = r;
        }
    };
    vector<int> levelPrintTree(vector<int>& pre, vector<int>& mid) {
        int n = pre.size();
        Node* root = helper(pre, 0, n - 1, mid, 0, n - 1);
        vector<int> ans;
        if (!root) return ans;
        queue<Node*> q;
        q.push(root);
        while (!q.empty()) {
            int sz = q.size();
            while (sz--) {
                root = q.front(); q.pop();
                ans.push_back(root->val);
                if (root->left) q.push(root->left);
                if (root->right) q.push(root->right);
            }
        }
        return ans;
    }
    Node* helper(vector<int>& pre, int s1, int e1, vector<int>& mid, int s2, int e2) {
        if (s1 > e1) return nullptr;
        if (s1 == e1) return new Node(pre[s1]);
        Node* root = new Node(pre[s1]);
        int pos2 = 0;
        for (int i = s2; i <= e2; ++i) if (mid[i] == pre[s1]) { pos2 = i; break; }
        int pos1 = s1 + pos2 - s2;
        root->left = helper(pre, s1 + 1, pos1, mid, s2, pos2 - 1);
        root->right = helper(pre, pos1 + 1, e1, mid, pos2 + 1, e2);
        return root;
    }
};

Java:[此代码未进行大量数据的测试,仅供参考]

import java.util.*;

class Solution {
    public static class Node {
        int val;
        Node left, right;

        Node(int x) {
            val = x;
            left = null;
            right = null;
        }
    }

    public List<Integer> levelPrintTree(List<Integer> pre, List<Integer> mid) {
        int n = pre.size();
        Node root = helper(pre, 0, n - 1, mid, 0, n - 1);
        List<Integer> ans = new ArrayList<>();
        if (root == null) return ans;
        Queue<Node> q = new LinkedList<>();
        q.add(root);
        while (!q.isEmpty()) {
            int sz = q.size();
            while (sz-- > 0) {
                root = q.poll();
                ans.add(root.val);
                if (root.left != null) q.add(root.left);
                if (root.right != null) q.add(root.right);
            }
        }
        return ans;
    }

    private Node helper(List<Integer> pre, int s1, int e1, List<Integer> mid, int s2, int e2) {
        if (s1 > e1) return null;
        if (s1 == e1) return new Node(pre.get(s1));
        Node root = new Node(pre.get(s1));
        int pos2 = 0;
        for (int i = s2; i <= e2; ++i) {
            if (mid.get(i) == pre.get(s1)) {
                pos2 = i;
                break;
            }
        }
        int pos1 = s1 + pos2 - s2;
        root.left = helper(pre, s1 + 1, pos1, mid, s2, pos2 - 1);
        root.right = helper(pre, pos1 + 1, e1, mid, pos2 + 1, e2);
        return root;
    }
}

Python:[此代码未进行大量数据的测试,仅供参考]

from typing import List
from collections import deque

class Solution:
    class Node:
        def __init__(self, x=0, left=None, right=None):
            self.val = x
            self.left = left
            self.right = right

    def levelPrintTree(self, pre: List[int], mid: List[int]) -> List[int]:
        def helper(pre, s1, e1, mid, s2, e2):
            if s1 > e1:
                return None
            if s1 == e1:
                return self.Node(pre[s1])
 

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

2024 BAT笔试合集 文章被收录于专栏

持续收录字节、腾讯、阿里、美团、美团、拼多多、华为等笔试题解,包含python、C++、Java多种语言版本,持续更新中。

全部评论

相关推荐

05-20 21:35
门头沟学院 Java
5.13&nbsp;总时长:1h30min1.&nbsp;自我介绍、项目介绍2.&nbsp;项目拷打:项目背景?自己完成了哪里?技术出彩的点?超卖的业务场景和解决细节?1.&nbsp;所有请求都在SET&nbsp;NX前面等待吗?重试的时间间隔是?有重试不就不公平了吗?锁的超时时间?为什么?一定能完成吗?2.&nbsp;为什么用Redis?不入库吗?丢了咋办?zset的数据结构是?具体实现细节是?3.&nbsp;SET&nbsp;NX和SET&nbsp;EX是两步,中间挂了咋办?Spring的事务是怎么保证实现的?4.&nbsp;下一个项目:怎么分词的?3.&nbsp;时间复杂度和空间复杂度怎么理解?二分查找的复杂度是多少?4.&nbsp;常见的数据结构?(一开始答成数据类型被紧急叫停hhh)链表是什么?应用场景是?数组呢?哈希表的原理和结构?5.&nbsp;树的结构还在哪些场景下使用?(丝滑转场到MySQL)innoDB的B+树是什么结构?xx场景下的xx字段适合建索引吗?6.&nbsp;HTTP和TCP分别工作在计网中的哪几层?Nginx中做TCP代理的话,能转发HTTP的请求吗?常见的HTTP状态码?HTTP返回readtimeout是为什么?(其实是处理太慢而不是连不上,答错了)7.&nbsp;进程、线程、协程分别是什么?区别?8.&nbsp;给代码说运行结果和原因9.&nbsp;Python写过吗?多进程会吗?(不会)C++写过吗?进程间通信的理论知识了解吗?10.&nbsp;a主机上一个进程上的一个线程要读取b主机内存中的一个数据,两个主机之间的层、数据、操作系统之类的交互过程是怎样的?如果是json报文(内存中——的话,内核态怎么从内存中取这部分数据(操作系统)?(说出了技术过程但不记得名字。。)11.&nbsp;Java中的垃圾回收器了解吗?讲一下。什么时候用标记-清理、标记-负值、标记-整理?12.&nbsp;做题:二分查找和一个排序(感觉应该写快排但是写了归并,并且因为想优化写了20+min不知道是不是太慢了)13.&nbsp;归并排序的优缺点是什么?归并和快排在复杂度上是什么区别?最坏情况下快排的复杂度?14.&nbsp;反问1.&nbsp;贵公司对实习生的要求:主要看基础和学习成长能力,项目经验没那么看重2.&nbsp;很想问表现怎样,但是还是问不出口
查看18道真题和解析
点赞 评论 收藏
分享
评论
点赞
10
分享

创作者周榜

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