【某SH公E司IN 数据挖掘工程师-提前批笔试2023-8-8】

news2024/9/23 17:19:51

题目(回忆版):

给一棵树,每个节点要么是白色要么是红色,并且有节点编号,要求查询每个节点所在子树中红色节点的数量。
先是一个正整数 n,表示树有 n 个节点。
第二行给出 n-1 个数字,表示从2号节点开始每个节点的父节点编号。
第三行给出长度为 n 的字符串,表示从1号节点开始每个节点的颜色(W白色/R红色)。
接下来是一个正整数 q,表示有 q 次查询。
然后是 q 行,每行一个正整数,对应一个节点的编号,要求输出这个编号节点所在子树中红色节点的数量。

例一:
在这里插入图片描述
输入:
5
1 2 1 4
WRRWR
5
1
2
3
4
5
输出:
3
2
1
1
1

解题思路:

构建节点:节点中存储节点颜色和它的子节点们的编号。
存储节点:用一个编号与节点对象对应的 map 存储编号及对应的节点。
搜索节点:以节点编号在 map 中读取节点,根据节点内部存储的子节点编号在 map 中向下搜索子节点。
查询子树红色节点数量:深度优先搜索(类比二叉树后序遍历),统计红色子节点的数量,并将每个节点编号对应的红色子节点数记录在哈希表 h 中,之后每次查询都从哈希表 h 中直接查询即可。

代码:

#include <iostream>
#include <vector>
#include <string>
#include <map>
using namespace std;
struct TreeNode {
    int id;  // 节点编号
    char c;  // 节点颜色(W白色/R红色)
    vector<int> sub;  // 子节点编号
    TreeNode() {}
    TreeNode(int x, char y) : id(x), c(y) {}
};
map<int, TreeNode> m;  // 用于存储节点信息(编号,节点)
map<int, int> h;  // 用于存储节点的红色子节点数(节点编号,红色子节点数)
int dfs(TreeNode* root) {  // 搜索一个节点的红色子节点数
    if(root == nullptr) return 0;
    int sum = 0;
    int size = root->sub.size();
    for(int i = 0; i < size; i++) {
        sum += dfs(&m[root->sub[i]]);  // 递归搜索所有的子节点
    }
    sum += (root->c == 'R') ? 1 : 0;  // 如果当前节点是红色,则红色子节点数加一
    h[root->id] = sum;  // 将当前节点的红色子节点数存入map
    return sum;  // 向父节点传递当前节点的红色子节点数
}

int main() {
    int n;
    while (cin >> n) {
        vector<int> a(n, 0);  // 从2号节点开始,每个节点的父节点编号
        string s;  // 每个节点的颜色(按节点编号顺序)
        for(int i = 1; i < n; i++) {
            cin >> a[i];
        }
        cin >> s;
        m.clear();
        TreeNode n1(1, s[0]);  // 根节点
        m.emplace(1, n1);  // 将根节点存入map的第一个位置
        for(int i = 1; i < n; i++) {
            TreeNode temp(i + 1, s[i]);  // 创建第i+1号节点
            m.emplace(i + 1, temp);
            m[a[i]].sub.emplace_back(i + 1);  // 将第i+1号节点存入其父节点的子节点集合中
        }
        h.clear();
        dfs(&m[1]);  // 从根节点开始完成搜索一次,即可得到所有节点的红色子节点数,存入h表,后续查询的时间复杂度都是O(1)
        int q;
        cin >> q;
        while(q--) {  // q次查询
            int t;
            cin >> t;
            cout << h[t] << endl;
        }
    }
}

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

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

相关文章

标准的OSI七层模型(其实了解tcp足矣)

七层模型&#xff0c;亦称OSI&#xff08;Open System Interconnection&#xff09;。参考模型是国际标准化组织&#xff08;ISO&#xff09;制定的一个用于计算机或通信系统间互联的标准体系&#xff0c;一般称为OSI参考模型或七层模型。 它是一个七层的、抽象的模型体&#x…

Mermaid语法使用

Mermaid语法使用 1. 基础类1.1 流程图1.2 时序图 2. 工程图2.1 类图2.2 Git图 1. 基础类 1.1 流程图 graph TBid1(圆角矩形)--普通线-->id2[矩形];subgraph 子图id2粗线>id3{菱形}id3-. 虚线.->id4>右向旗帜]id3--无箭头---id5((圆形))end方向定义 用词含义TB从…

Spring(13) IOC的工作流程

目录 一、定义二、Bean的声明方式三、IOC的工作流程 一、定义 IOC&#xff1a;全称是 Inversion Of Control&#xff0c;也就是控制反转&#xff0c;它的核心思想是把对象的管理权限交给容器。应用程序如果需要使用某个对象的实例&#xff0c;那么直接从 IOC 容器里面去获取就…

Win10无法投影关闭3D模式

Win10不小心开启了3D模式&#xff0c;插上投影仪就一闪一闪的&#xff0c;无法正投影 解决办法&#xff1a; 1. 打开注册表工具regedit&#xff0c;删除以下注册表&#xff0c;重启电脑 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\GraphicsDrivers\Configurat…

PAT(Advanced Level) Practice(with python)——1023 Have Fun with Numbers

Code N int(input()) D_N 2*N # print(Yes)if len(str(D_N))>len(str(N)):print(No) else:for s in str(D_N):if s not in str(N) or str(D_N).count(s)!str(N).count(s):print("No")breakelse:print(Yes) print(D_N)

R语言5_安装Giotto

环境Ubuntu22/20, R4.1. 已开启科学上网。 第一步&#xff0c;更新服务器环境&#xff0c;进入终端&#xff0c;键入如下命令&#xff0c; apt-get update apt install libcurl4-openssl-dev libssl-dev libxml2-dev libcairo2-dev libgtk-3-dev libhdf5-dev libmagick9-dev …

第一百二十五天学习记录:C++提高:STL-deque容器(下)(黑马教学视频)

deque插入和删除 功能描述&#xff1a; 向deque容器中插入和删除数据 函数原型&#xff1a; 两端插入操作&#xff1a; push_back(elem); //在容器尾部添加一个数据 push_front(elem); //在容器头部插入一个数据 pop_back(); //删除容器最后一个数据 pop_front(); //删除容器…

flutter开发实战-TextPainter计算文本内容的宽度

flutter开发实战-TextPainter计算文本内容的宽度 最近开发过程中根据Text文本的大小判断是否需要进行显示跑马灯效果&#xff0c;获取文本的大小&#xff0c;需要TextPainter来获取Size 一、TextPainter TextPainter主要用于实现文本的绘制。TextPainter类可以将TextSpan渲染…

【从零开始学习JAVA | 第四十四篇】TCP协议中的握手与挥手

前言&#xff1a; TCP&#xff08;传输控制协议&#xff09;作为计算机网络中的重要协议&#xff0c;扮演着确保数据可靠传输的角色。在TCP的通信过程中&#xff0c;握手与挥手问题是不可忽视的关键环节。握手是指在建立连接时&#xff0c;客户端与服务器相互确认彼此的身份并…

Json简述(C++)

目录 1.介绍 2.格式 3.底层 3.1数据对象表示 3.2序列化接口 3.3反序列化接口 4.使用 1.介绍 Json&#xff08;JavaScript Object Notation&#xff09;是一种轻量级的数据交换格式&#xff0c;其最早是为JavaScript编程语言设计的格式。不过发发展至今&#xff0c;Jso…

[RoarCTF 2019Online Proxy]sql巧妙盲注

文章目录 [RoarCTF 2019Online Proxy]sql巧妙盲注解题脚本脚本解析 [RoarCTF 2019Online Proxy]sql巧妙盲注 解题 在源代码界面发现&#xff1a;Current Ip 我们会联想到&#xff1a;X-Forwarded-For来修改ip&#xff1a; 结果我们发现&#xff0c;response会讲Last Ip回显出…

基于协同过滤的电影推荐

基于协同过滤的推荐算法综述 - 知乎 (zhihu.com) # -*- coding: gbk -*- import pandas as pd_userID 1#电影评分排序 ratings pd.read_csv(ml-latest-small/ratings.csv) #打印前20行 #print(ratings.head(10))#电影所属类别 movies pd.read_csv(ml-latest-small/movies.cs…

怎么做思维导图?试试这种绘制方法

怎么做思维导图&#xff1f;思维导图是一种非常实用的工具&#xff0c;可以帮助我们更好地整理思路、总结知识和规划方案。但是传统的手绘或电脑软件绘制思维导图的方法需要一定的时间和技能&#xff0c;对于想要快速制作思维导图的人来说可能不太方便。下面就给大家介绍一种在…

如何测试Linux磁盘的读写速度

在Linux系统中也有很多命令可以测试硬盘的读写速度指标。以下是几个常用命令&#xff08;注意&#xff1a;在执行测试命令之前&#xff0c;请务必备份数据以避免数据丢失&#xff01; 1、dd 命令 首先挂载磁盘 mount /dev/sdb /testdd 命令可用于进行硬盘读写速度测试。 例…

idea在控制台中输出文字显示乱码

VM options中加入下面这行 -Dfile.encodingutf-8

leetcode27—移除元素

思路&#xff1a; 参考26题目双指针的思想&#xff0c;只不过这道题不是快慢指针。 看到示例里面数组是无序的&#xff0c;也就是说后面的元素也是可能跟给定 val值相等的&#xff0c;那么怎么处理呢。就想到了从前往后遍历&#xff0c;如果left对应的元素 val时&#xff0c…

每日汇评:在50日移动均线下方,黄金的下行势

1、在美国周三公布通胀数据之前&#xff0c;金价可能会有所回升&#xff1b; 2、对中国通缩的担忧可能会限制金价反弹&#xff1b; 3、在每日技术面看跌的背景下&#xff0c;黄金价格仍处于“反弹后卖出”的状态&#xff1b; 金价从周二创下的一个月新低1923 美元开始大幅反…

go-zero 是如何实现计数器限流的?

原文链接&#xff1a; 如何实现计数器限流&#xff1f; 上一篇文章 go-zero 是如何做路由管理的&#xff1f; 介绍了路由管理&#xff0c;这篇文章来说说限流&#xff0c;主要介绍计数器限流算法&#xff0c;具体的代码实现&#xff0c;我们还是来分析微服务框架 go-zero 的源…

com.alibaba.fastjson.JSONObject循环给同一对象赋值会出现“$ref“:“$[0]“现象问题

文章目录 1、问题介绍2、如何解决fastjson中$ref对象重复引用问题3、举例说明 1、问题介绍 有些场景下&#xff0c;我们会选择用JSONObject代替Map来处理业务逻辑&#xff0c;但是使用JSONObject时有一个需要注意的地方&#xff1a;在处理JSONObject对象时&#xff0c;引用的c…

SpringBoot基础之注册Servlet三大组件

文章目录 前言一、介绍二、注入Bean2.1.ServletRegistrationBean2.2.FilterRegistrationBean2.3.ServletListenerRegistrationBean 三.演示结果总结 前言 本文章将介绍SpringBoot注册Servlet的三大组件 一、介绍 由于SpringBoot默认是以jar包的方式运行嵌入式Servlet容器来启…