【备战秋招】每日一题:4月1日美团春招(二批)第五题:题面+题目思路 + C++/python/js/Go/java带注释

news/2024/11/8 2:50:58/

2023大厂笔试模拟练习网站(含题解)

www.codefun2000.com
最近我们一直在将收集到的各种大厂笔试的解题思路还原成题目并制作数据,挂载到我们的OJ上,供大家学习交流,体会笔试难度。现已录入200+道互联网大厂模拟练习题,还在极速更新中。欢迎关注公众号“塔子哥学算法”获取最新消息。
在这里插入图片描述
提交链接:

https://codefun2000.com/p/P1141

为了更好的阅读体检,可以查看OJ上的题解。进入提交链接,点击右边菜单栏的"查看塔子哥的题解"

题目内容

塔子哥是一名计算机科学家,他正在研究一种新的数据结构——树。树是一种无向无环联通图,它由若干个节点和若干条边组成。

每个节点都可以有零个或多个子节点,而每条边都连接两个节点。塔子哥现在有一棵树,树上的每个节点都有自己的价值。价值的计算规则如下所示:

  1. 若某节点 N N N 没有儿子节点,那么节点 N N N 价值为 1 1 1
  2. 若某节点 N N N 有两个儿子节点,那么节点 N N N 价值为两个儿子节点的价值之和,或者价值之按位异或。这取决于节点 N N N 的颜色,若 N N N 的颜色为红色,那么节点 N N N 价值为两个儿子节点的价值之和;若 N N N 的颜色为绿色,那么节点 N N N 价值为两个儿子节点的价值之按位异或。

3. 若某节点 N N N 只有一个儿子节点,则它等于这个唯一的儿子的权值

按位运算就是基于整数的二进制表示进行的运算。按位异或用符号 表示,两个对应位不同时为 1 1 1 ,否则为 0 0 0

如:

5 = ( 101 ) 2 5=(101)_2 5=(101)2

6 = ( 110 ) 2 6=(110)_2 6=(110)2

5 ⊕ 6 = 3 ,即 ( 101 ) 2 ⊕ ( 110 ) 2 = ( 011 ) 2 5⊕6=3,即(101)_2⊕(110)_2 = (011)_2 56=3,即(101)2(110)2=(011)2

输入描述

第一行一个正整数 n n n 表示节点个数。

第二行 n − 1 n-1 n1 个正整数 p [ i ] p[i] p[i] 2 ≤ i ≤ n 2\le i \le n 2in )表示第 i i i 个节点的父亲。 1 1 1 号节点是根节点。

第三行 n n n 个整数 c [ i ] c[i] c[i] 1 ≤ i ≤ n 1\le i\le n 1in ),当 c [ i ] = 1 c[i] =1 c[i]=1 时表示第 i i i 个节点是红色, c [ i ] = 2 c[i] = 2 c[i]=2 则表示绿色。

数据保证形成合法的树。

对于所有的数据, n ≤ 50000 n\le 50000 n50000

输出描述

输出一行一个整数表示根节点的值。

样例

输入

3
1 1
2 2 2

输出

0

思路:树上dfs

题目保证这是一棵有根树,且每个节点的子节点最多 2 2 2 个。所以可以考虑自底向上(也就是从各个叶子节点开始)dfs,根据题目意思求解每个点的权值。

时间复杂度: O ( n ) O(n) O(n)

类似知识点题目推荐

这道题是非常经典,也非常"裸"的树上dfs问题。LeetCode上有非常多的例题,并且在2023年春招过程中考了114514次。望周知。

LeetCode

  1. 112. 路径总和
  2. 129. 求根到叶子节点数字之和
  3. 236. 二叉树的最近公共祖先

CodeFun2000

1.P1224 携程 2023.04.15-春招-第三题-魔法之树

2.P1159. 2022年清华大学(深圳)保研夏令营机试题-第一题-树上计数

3.P1196 华为 2023-04-19-第二题-塔子哥出城

4.P1044. 拼多多内推笔试-2023.2.22.投喂珍珠

5.P1193. 腾讯音乐 2023.04.13-暑期实习-第二题-价值二叉树

更多请见:知识点分类-训练-深度优先搜索专栏

代码

C++

#include <bits/stdc++.h>
using namespace std;
int main()
{int n;cin >> n;vector<int> c(n);vector<vector<int>> g(n);// 读入数据for (int i = 1; i < n; ++i) {int fa; cin >> fa;g[fa - 1].emplace_back(i);}for (int i = 0; i < n; ++i) cin >> c[i];// C++11 的Lambda表达式 , dfsfunction<int(int)> dfs = [&](int u) {// 遇到叶子节点 = 递归出口,向上返回if (g[u].empty()) return 1;// 先递归求儿子节点的权值,然后根据题意求该节点的权值int sum = 0;for (int v: g[u]) {if (c[u] == 1) sum += dfs(v);else sum ^= dfs(v);}return sum;};cout << dfs(0) << "\n";return 0;
}

Java

import java.util.*;
import java.util.function.*;public class Main {private static List<Integer> c; // 标记每个节点的颜色private static List<List<Integer>> g; // 存储树的邻接表private static int dfs(int u) {// 遇到叶子节点,返回if (g.get(u).isEmpty()) return 1; int sum = 0;for (int v : g.get(u)) {  // 遍历当前节点的邻居节点if (c.get(u) == 1) sum += dfs(v); // 当节点的颜色为红色时,将其子节点的dfs和加起来else sum ^= dfs(v); // 当节点的颜色为绿色时,将其子节点的dfs和异或起来}return sum; // 返回最终计算得到的值}public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int n = scanner.nextInt(); // 读入节点数c = new ArrayList<>(); // 初始化颜色列表g = new ArrayList<>(); // 初始化邻接表for (int i = 0; i < n; ++i) {g.add(new ArrayList<>()); // 为每一个节点创建一个空的邻接表}for (int i = 1; i < n; ++i) {int fa = scanner.nextInt(); // 读入当前节点的父节点g.get(fa - 1).add(i); // 将当前节点加入父节点的邻接表}for (int i = 0; i < n; ++i) {c.add(scanner.nextInt()); // 读入每个节点的颜色}System.out.println(dfs(0)); // 输出从根节点开始的深度优先搜索结果}
}

Python

n = int(input())  # 读入节点数g = [[] for i in range(n)]  # 初始化邻接表fa = list(map(int, input().split(" ")))  # 读入每个节点的父节点
for i in range(0, n - 1):g[fa[i] - 1].append(i + 1)  # 将当前节点加入父节点的邻接表c = list(map(int, input().split(" ")))  # 读入每个节点的颜色def dfs(u):if len(g[u]) == 0:return 1  # 叶子节点,默认返回1s = 0for v in g[u]:  # 遍历当前节点的邻居节点if c[u] == 1: s += dfs(v)  # 当节点的颜色为白色时,将其子节点的dfs和加起来else: s ^= dfs(v)  # 当节点的颜色为黑色时,将其子节点的dfs和异或起来return s  # 返回最终计算得到的值print(dfs(0))  # 输出从根节点开始的深度优先搜索结果

Js


process.stdin.resume();
process.stdin.setEncoding('utf-8');
let input = '';
process.stdin.on('data', (data) => {input += data;return;
});
process.stdin.on('end', () => {const lines = input.trim().split('\n');let n = parseInt(lines[0]);  // 读入节点数let g = new Array(n);for(let i=0; i<n; i++) {g[i] = new Array();}  // 初始化邻接表let fa = lines[1].split(" ").map(Number);for(let i=0; i<n-1; i++) {g[fa[i]-1].push(i+1);  // 将当前节点加入父节点的邻接表}  // 读入每个节点的父节点let c = lines[2].split(" ").map(Number);  // 读入每个节点的颜色function dfs(u) {if(g[u].length === 0) {return 1;}  // 叶子节点默认返回1let s = 0;g[u].forEach((v) => {if(c[u] === 1) s += dfs(v);  // 当节点的颜色为白色时,将其子节点的dfs和加起来else s ^= dfs(v);  // 当节点的颜色为黑色时,将其子节点的dfs和异或起来});return s;  // 返回最终计算得到的值}console.log(dfs(0));  // 输出从根节点开始的深度优先搜索结果
});

Go

package mainimport ("fmt"
)func dfs(u int, g [][]int, c []int) int {if len(g[u]) == 0 {return 1    // 叶子节点,默认返回1}s := 0for _, v := range g[u] {    // 遍历当前节点的邻居节点if c[u] == 1 {s += dfs(v, g, c)   // 当节点的颜色为白色时,将其子节点的dfs和加起来} else {s ^= dfs(v, g, c)   // 当节点的颜色为黑色时,将其子节点的dfs和异或起来}}return s    // 返回最终计算得到的值
}func main() {var n intfmt.Scan(&n)    // 读入节点数g := make([][]int, n)for i := 0; i < n; i++ {g[i] = make([]int, 0)}    // 初始化邻接表fa := make([]int, n-1)for i := 0; i < n-1; i++ {fmt.Scan(&fa[i])g[fa[i]-1] = append(g[fa[i]-1], i+1)    // 将当前节点加入父节点的邻接表}    // 读入每个节点的父节点c := make([]int, n)for i := 0; i < n; i++ {fmt.Scan(&c[i])}    // 读入每个节点的颜色fmt.Println(dfs(0, g, c))    // 输出从根节点开始的深度优先搜索结果
}

http://www.ppmy.cn/news/172554.html

相关文章

联想微型计算机boot,联想电脑boot设置图解

联想电脑boot设置图解 不管是台式机还是笔记本如果安装的主板不同&#xff0c;其主板BISO程序也略有不同。联想笔记本的里面的主板BIOS设置就跟别的笔记本的BIOS设置有少许的差异&#xff0c;下面就小编在联想笔记本维修过程中吸取一些关于主板BIOS设置经验&#xff0c;来向各位…

联想电脑 linux BIOS,联想电脑bios怎么设置

BIOS是英文“Basic Input Output System”的缩略语,直译过来就是“基本输入输出系统”。其实,它是一组固化到计算机内主板上一个ROM芯片上的程序,那么联想电脑bios怎么设置?下面大家跟着学习啦小编一起来学习一下吧。 联想电脑bios设置方法 1、开机时&#xff0c;按F2&#xf…

联想台式计算机编号怎么查,联想电脑怎么查看主机编号_联想电脑编号在哪里...

联想电脑怎么查看主机编号呢&#xff1f;下面介绍几种方法供你使用 1、主机背面的黑白标识牌 主机编号由主机型号TYPE xxxx-xxx和序列号 S/N xx-xxxxx 14位数字和字母组合而成。 2、电池槽位查看主机编号 如果机器处于开机状态&#xff0c;建议关机后拿掉电池&#xff0c;查看主…

联想电脑 linux bios设置,韩博士分享关于联想电脑bios的基本设置

BIOS设置是很多用户在重装系统时都需要用到的&#xff0c;而关于BIOS品牌的主板也有很多&#xff0c;所以在设置上也会存在一定的差异。一般电脑的开机启动快捷键为F12&#xff0c;有些电脑开机的时候在电脑屏幕下方会显示哪个键可以用来设置启动选项&#xff0c;有些电脑不显示…

联想如何打开计算机配置,联想电脑如何进入bios设置

联想电脑进入BIOS的快捷键有“F2、F1、Del/Delete、NOVO开机” 部分机型按F2、F1时需要FN键配合 注:使用Win8/8.1操作系统的电脑,需要在系统下选择重启,在“开机自检界面”连续点击对应快捷键进入BIOS界面,详细方法见如下解决方案 联想笔记本产品进入BIOS的操作方法 适用范…

联想的锋行计算机,联想电脑锋行系列都有哪些型号

尊敬用户您好&#xff0c;根据您的提出问题&#xff0c;应该是联想锋行 X5520这款电脑 &#xff0c;以下是它的详细介绍 联想锋行 X5520CPU规格 CPU类型 Intel 奔腾双核 CPU频率 2200MHz 二级缓存 1MB 前端总线 800MHz CPU说明 Intel 奔腾双核 E2200 2.2GHz 联想锋行 X5520显示…

联想计算机boss设置,联想电脑如何进行bios设置 联想电脑bios设置教程

联想电脑如何进行bios设置? 计算机用户在使用计算机的过程中&#xff0c;都会从一开始接触到BIOS&#xff0c;它在计算机系统中起着非常重要的作用。一块主板性能优越与否&#xff0c;很大程度上取决于主板上的BIOS管理功能是否先进。下面&#xff0c;我们就来看看 bios设置图…

怎么进入联想电脑bios系统

不同的电脑品牌的主板进入bios系统的快捷键和方法会有所差异&#xff0c;想要进入bios进行相关的系统设置的话就需要了解对应的电脑品牌的启动键等等信息。有网友想了解联想电脑bios怎么进入&#xff0c;下面小编就教下大家进入联想电脑bios的方法。 首先&#xff0c;联想有多…