【笔试练习】深信服校园招聘c/c 软件开发H卷

news2024/11/13 23:45:35

题目链接

一、填空题

  1. 如图所示,平面上有两条平行的线段,上面的线段有A0~A3 4个点,下面的线段有B0到B5 6个点,现在需要把所有的点都连接起来,有如下约束:

    每个端点,都至少有一条到另一平行线上端点的连线;
    连线之间不能有交叉(除了端点,线与线之间不能有连接的地方);

    请问,总共有多少种连法?
    在这里插入图片描述

    答案:231

二、编程题

1. 访问权限

题目
JSON是一种可以用来保存配置的数据格式,其结构为树状。JSON中某个子节点的位置可以JSON路径的形式表示,JSON路径类似UNIX文件路径,以’/'分隔父子节点名。JSON路径中不会出现空格。
如下JSON值中
mem – daemons – findme
| |- waccd
|
|- apps – appd

findme子节点的JSON路径为: /mem/daemons/findme
appd子节点的JSON路径为:/mem/apps/appd
waccd子节点的JSON路径为:/mem/daemons/waccd
有一个列表用来描述各JSON子节点是否允许用户编辑。如下:
Y /mem/daemons/findme
N /mem/daemons
Y /mem

如果有设置用户对某个子节点的权限,则实际权限为该设定权限,否则继承其父节点的可访问性,对根节点的默认访问权限为N。

输入描述
第一行为一个正整数N,表示接下来有N行数据(0 < N < 100)
第2行到第N+1行,为字符串Path,表示待检查访问权限的JSON路径。
第N+2行为一个正整数T,表示接下来有T行数据(0 < T < 1000)
接下来会有T行数据,格式为"权限 JSON路径"。
权限有两种取值:Y和N
JSON路径最大长度为256
输出描述
输出“权限”,权限表示该节点的实际访问权限。
示例1
输入例子:
1
/mem/total
3
Y /mem/daemons/findme
N /mem/daemons
Y /mem

输出例子:
Y

思路——前缀树

将字符串 /mem/start拆分成 mem、start 两单词, 每个单词为一个前缀。

  • 前缀树的属性

    • 当前文件夹是否有权限
    • 当前文件夹是否是继承父目录的权限
    • 当前文件夹的子目录
    • 当前文件夹的名字
  • 前缀树的操作

    • 插入
    • 查询
    • 更新所有文件夹的权限信息
  • 主程序读入所有信息

    • 将待查询的信息,先存在一个 vector 中
    • 将其余信息用于构建前缀树
  • 构建前缀树的过程

    • vector<string> str 保存路径的名字信息(利用函数拆分字符串)
    • 检查map中是否有 str[i] 这个文件夹的名字, 如果没有, 则创建一个文件夹,并赋予父目录的权限
    • node 指向 map[str[i]] 这个节点
  • 查询前缀树的过程:

    • 逐个判断path 中的名字是否在前缀树出现
    • 如果没有出现,则返回当前 node 的权限

代码:

#include<iostream>
#include<vector>
#include<map>
#include<unordered_map>
using namespace std;

class Trie {
public:
    bool hava_Authority = false; 
    bool isInherient = true; // 当前节点的权限是不是继承父节点的
    unordered_map<string, Trie*> ls; // 孩子节点
    string name;
    Trie(bool au, string str) {
        hava_Authority = au; 
        name = str;
    }
    Trie() {}
    void insert(bool au, vector<string> str) {
        if (str.empty()) { 
            this->isInherient = false;
            this->hava_Authority = true;
            return;
        }
        Trie* node = this; // 当前节点(作为父节点)
        for (int i = 0; i < str.size(); i++) {
            // 在当前节点的孩子没有找到,说明目前没有该路径,需要新建节点
            if (node->ls.find(str[i]) == node->ls.end()) {
                Trie* tmp = new Trie(node->hava_Authority, str[i]); // 继承父节点的权限
                node->ls.insert(make_pair(str[i], tmp)); // umap 的插入语句
            }
            // 已经存在该路径,更新当前节点的下一个访问位置
            node = node->ls.find(str[i])->second;
        }
        // 遍历完 str,就可以更新最后一个节点的权限
        if (node->isInherient) node->hava_Authority = au; // 记录新的权限
        node->isInherient = false; // 由于最后一个节点肯定有自己的权限,所以标记为非继承
    }

    bool query(vector<string> str) {
        Trie* node = this;
        for (int i = 0; i < str.size(); i++) {
            // 如果在下一层找不到,说明当前层就是最终层
            if (node->ls.find(str[i]) == node->ls.end()) {
                break;
            }
            // 如果在孩子节点能找到下一层,就递归查询
            node = node->ls.find(str[i])->second;
        }
        // 返回当前层的权限
        return node->hava_Authority;
    }

    // 权限更新
    void update() {
        Trie* node = this;
        for (auto it = node->ls.begin(); it != node->ls.end(); it++) {
            if (it->second->isInherient) { // 是继承,此时权限是父节点的权限
                node->ls[it->first]->hava_Authority = node->hava_Authority;
            }
            node->ls[it->first]->update(); // 递归更新儿子
        }
    }
};

vector<string> split(string str) {
    str += "/"; // 在末尾加上 '/' ,遇到最后一个字符也不需要特殊处理
    str = str.substr(1); // 跳过第一个 '/' 开始遍历
    vector<string> res;
    string tmp;
    for (int i = 0; i < str.size(); i++) {
        if (str[i] == '/') {
            if (tmp.size()) res.push_back(tmp);
            continue;
        }
        tmp += str[i];
    }
    return res;
}

int main() {
    Trie* root = new Trie();
    int n;
    cin >> n;
    vector<vector<string>> query;
    while (n--) {
        string t;
        cin >> t;
        query.push_back(split(t));
    }
    cin >> n;
    string a, b;
    while (n--) {
        cin >> a >> b;
        if (a == "Y") {
            root->insert(true, split(b));
        }
        else {
            root->insert(false, split(b));
        }
    }
    // 插入结束后,对所有节点进行权限更新
    root->update();
    // 查询权限
    for (int i = 0; i < query.size(); i++) {
        if (root->query(query[i])) {
            cout << "Y\n";
        }
        else {
            cout << "N\n";
        }
    }
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2101509.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

仿微信聊天系统开发功能架构分析

仿微信聊天系统是一种旨在模仿微信核心聊天功能的应用或软件&#xff0c;它允许用户通过即时通讯进行交流。该系统通常由客户端、服务器端和数据库组成&#xff0c;以支持用户间的实时消息传送。以下是对仿微信聊天系统的一个概述&#xff1a; 一、系统架构 客户端 用户界面&…

【面试05】PID控制算法

一、 PID算法简介 PID&#xff08;Proportional-Integral-Derivative&#xff09;控制算法是一种经典的反馈控制方法&#xff0c;广泛应用于自动控制系统&#xff0c;例如温度控制、速度控制、位置控制等。 PID控制算法的核心包含三个部分&#xff1a;比例项&#xff08;P&…

一键掌控园区运营,数字化管理平台如何实现?

在当今数字化时代&#xff0c;高效的管理是企业成功的关键。对于各类园区而言&#xff0c;如何实现一键掌控园区运营&#xff0c;成为了提升竞争力的重要课题。幸运的是&#xff0c;数字化管理平台的出现如同一把智慧钥匙&#xff0c;为实现园区运营提供了完美的解决方案。 数字…

<Rust>egui学习之小部件(九):如何在窗口中添加下拉列表combobox部件?

前言 本专栏是关于Rust的GUI库egui的部件讲解及应用实例分析&#xff0c;主要讲解egui的源代码、部件属性、如何应用。 环境配置 系统&#xff1a;windows 平台&#xff1a;visual studio code 语言&#xff1a;rust 库&#xff1a;egui、eframe 概述 本文是本专栏的第九篇博…

系统编程-数据库

数据库 目录 数据库 引入 1、先安装数据库 2、数据库设置密码 3、数据库的进入和退出(前提 你的密码更改过了) 数据库的基本操作 1、显示所有的数据库 2、创建数据库 3、删除数据库 4、选择数据库 在数据库中对表进行操作 1、查看当前数据库中的表 2、在数据库中…

Spring框架——springweb(一篇包会)

目录 一、Springweb概述 1.SpringWeb特点 2.SpringWeb组件 3.SpringWeb运行流程 二、搭建Springweb 1.导入框架所需的包 2.配置 DispatcherServlet 3.开启SpringWeb注解 4.处理器类搭建 5.请求处理 &#xff08;1&#xff09;接收请求RequestMapping &#xff08;2&…

大疆上云API基于源码部署

文章目录 大疆上云API基于源码部署1、学习官网2、环境准备注意事项3、注册成为DJI开发者4、下载前后端运行所需要的包/依赖前端依赖下载后端所需要的Maven依赖包 用到的软件可以在这里下载5、MySQL数据库安装安装MySQL启动MySQL服务在IDEA中配置MySQL的连接信息 6、Redis的安装…

Visual Studio Code大大提升工作效率小技巧~~~

Visual Studio Code &#xff08; VS Code &#xff09;是一个知名且评价很高的代码编辑器&#xff0c;具有大量功能和扩展以增强开发体验。使用 VS Code 的主要好处之一是它的灵活性&#xff0c;允许开发人员根据他们的特定需求对其进行自定义。 此外&#xff0c;VS Code 轻巧…

(十五)SpringCloudAlibaba-Sentinel持久化到Nacos

前言 在前面我们已经将Sentinel配置的规则持久化到系统的文件中。本章节我们将Sentinel持久化到Nacos中; 传送门(Sentinel数据持久化到文件)https://blog.csdn.net/weixin_45876411/article/details/140742963 默认情况下 Sentinel 只能接收到 Nacos 推送的消息&#xff0c;但…

JNPF低代码:可视化如何赋能企业的转型之路

在数字化转型的浪潮中&#xff0c;企业面临着前所未有的挑战与机遇。传统的软件开发方式往往耗时长、成本高&#xff0c;且难以快速适应市场变化。低代码开发平台的出现&#xff0c;为企业的数字化转型提供了新的思路和工具。其中&#xff0c;JNPF低代码平台以其独特的可视化特…

LDR6023:革新手机转接器体验,快充与OTG并存的科技杰作

在智能设备日益普及的今天&#xff0c;手机已经成为我们日常生活中不可或缺的一部分。然而&#xff0c;随着功能的不断增加&#xff0c;手机对于电力和数据传输的需求也日益提升。为了应对这一挑战&#xff0c;深圳市乐得瑞科技有限公司凭借其深厚的科技积累和创新精神&#xf…

嵌入式系统------ARM

目录 一.c语言回顾 1.特殊符号 &#xff08;1&#xff09;const &#xff08;2&#xff09;static &#xff08;3&#xff09;extern 2.内存的结构 &#xff08;1&#xff09;kernel&#xff1a;内核 &#xff08;2&#xff09;栈区 &#xff08;3&#xff09;堆区 &#xff08…

Java 入门指南:Java 并发编程 —— 并发容器 ConcurrentSkipListMap

ConcurrentMap ConcurrentMap 是 Java 并发包中提供的一个接口&#xff0c;它继承了 java.util.Map 接口&#xff0c;专门用于支持高并发环境下的线程安全操作。ConcurrentMap 提供了一系列线程安全的方法&#xff0c;旨在解决在多线程环境下使用普通 Map 类型&#xff08;如 …

用ChatGPT三分钟写一个完美的PPT,彻底告别繁琐的制作过程

用AI或ChatGPT来制作PPT的方式多得很&#xff01; 下面就用超级简单的语言&#xff0c;一步步教你怎么搞定&#xff0c;三分钟内保准搞定你的PPT。 所有需要的方法和工具都在这里&#xff01; 很简单&#xff0c;只要你输入一个标题&#xff0c;AI就能完成PPT的制作。 如果…

文件 fd

目录 1. 建立共识原理2. 回忆 C 文件接口2.1 当前工作路径2.2 w / a 方式写入2.3 默认打开的三个文件流 3. 认识文件系统调用3.1 O_WRONLY|O_CREAT 写时创建3.2 O_TRUNC 截断长度&#xff08;也即全覆盖式写入&#xff09;3.3 O_APPEND 追加 4. 浅谈文件访问的本质4.1 简证 1. …

高级算法设计与分析 学习笔记 2 希尔排序 线性时间内的排序——计数排序,基数排序,桶排序

希尔排序&#xff08;比较排序&#xff09; 要选定一个步长&#xff08;比如4&#xff09;&#xff0c;那么0&#xff0c;4&#xff0c;8……它们是一组&#xff0c;1&#xff0c;5&#xff0c;9……他们是一组。分组排完之后再换成2步长&#xff0c;最后改成1&#xff0c;就行…

牛心包瓣类医用生物瓣膜厚度无损检测

关键字&#xff1a;牛心包瓣膜&#xff0c;牛心包瓣叶&#xff0c;生物瓣膜&#xff0c;生物心脏膜&#xff0c;测厚仪&#xff0c;瓣膜生产&#xff0c;瓣膜检测设备&#xff0c; 牛心包瓣叶的厚度和轮廓所需的高精度取决于多个因素&#xff0c;包括瓣膜的制造标准、临床应用需…

百度飞将 paddle ,实现贝叶斯神经网络 bayesue neure network bnn,aistudio公开项目 复现效果不好

论文复现赛&#xff1a;贝叶斯神经网络 - 飞桨AI Studio星河社区 https://github.com/hrdwsong/BayesianCNN-Paddle 论文复现&#xff1a;Weight Uncertainty in Neural Networks 本项目复现时遇到一个比较大的问题&#xff0c;用pytorch顺利跑通源代码后&#xff0c;修改至pad…

【每日一练】python之tkinter的Label标签基础用法

""" 什么是tkinter窗口&#xff1f;tkinter是python中一个标准的库&#xff0c;用于创建图形界面&#xff08;GUI&#xff09;应用程序&#xff0c;它提供了一组工具和组件&#xff0c;使开发者能够在Python中创建窗口、按钮、标签、文本框、菜单等各种界面元素…

基于协同过滤的电影推荐系统

推荐系统已经成为当今互联网平台不可或缺的一部分&#xff0c;尤其是在电影、音乐和电子商务等领域。本文将带您深入探讨如何利用协同过滤算法&#xff0c;构建一个功能齐全的电影推荐系统。我们将结合Python、Django框架以及协同过滤算法&#xff0c;逐步实现这一目标。 完整…