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

news2024/11/21 0:22:29

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表达式 , dfs
    function<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  # 叶子节点,默认返回1
    s = 0
    for 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;
        }  // 叶子节点默认返回1
        let 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 main

import (
    "fmt"
)

func dfs(u int, g [][]int, c []int) int {
    if len(g[u]) == 0 {
        return 1    // 叶子节点,默认返回1
    }
    s := 0
    for _, 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 int
    fmt.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.coloradmin.cn/o/602893.html

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

相关文章

面试专题:JAVA虚拟机(1)

关于Java虚拟机&#xff0c;在面试的时候一般会问的大多就是①Java内存区域、②虚拟机垃圾算法、③虚拟机垃圾收集 器、④JVM内存管理、⑤JVM调优、⑥Java类加载机制这些问题了。推荐书籍《深入理解Java虚拟机&#xff1a;JVM高级特性 与最佳实践&#xff08;第二版》、《…

嵌入式Linux驱动开发 04:基于设备树的驱动开发

文章目录 目的基础说明开发准备设备树调整驱动程序与测试总结设备树文件内容 目的 前面文章 《嵌入式Linux驱动开发 03&#xff1a;平台&#xff08;platform&#xff09;总线驱动模型》 引入了资源和驱动分离的概念&#xff0c;这篇文章将在前面基础上更进一步&#xff0c;引…

内网或者没有公网IP,如何轻松通过公网访问?

很多网友都面临一个普遍的问题&#xff0c;就是作为家庭宽带用户没有公网IP&#xff0c;即没有IP v4的公网IP&#xff0c;我们天天盼着有一天IP v6能够普及。IP v4一共有2的32次方个地址&#xff0c;约43亿&#xff0c;中国仅为7000多万个&#xff0c;IP v6一共有2的128次方个地…

MySQL8.0版本在CentOS系统的配置教程

1.安装MySQL MySQL安装完成后&#xff0c;会自动配置为名称叫做&#xff1a;mysqld的服务&#xff0c;可以被systemctl所管理&#xff0c;我们在进行系统的配置时&#xff0c;主要修改root密码和允许root远程登录。 # 通过grep命令&#xff0c;在/var/log/mysqld.log文件中&a…

iOS开发:__weak __strong解决Block嵌套

Block使用会存在循环引用的问题&#xff0c;多个Block嵌套使用的情况更复杂&#xff0c;还会出现对象nil的问题。 为什么会循环引用&#xff1f; 现在iOS开发都是在ARC引用计数管理模式下的&#xff0c;参考另一篇文章《Block底层原理》&#xff0c;我们知道Block访问外部变量…

文心一言 VS 讯飞星火 VS chatgpt (29)-- 算法导论5.2 1题

一、在 HIRE-ASSISTANT 中&#xff0c;假设应聘者以随机顺序出现&#xff0c;你正好雇用一次的概率是多少&#xff1f;正好雇用 n 次的概率是多少? 文心一言&#xff1a; 讯飞星火&#xff1a; 华为盘古&#xff1a; 在HIRE-ASSISTANT中&#xff0c;假设应聘者以随机顺序出现…

仙境传说RO:从零开始编译服务端开发环境搭建安装Pandas-rAthena

仙境传说RO&#xff1a;从零开始编译服务端开发环境搭建安装Pandas-rAthena 大家好&#xff0c;我是艾西今天跟大家分享下仙境传说RO 开发脚本环境搭建。 Pandas是RO的模拟器实际上是开源的一个叫做rAthenna的一个开源项目 准备工具&#xff1a; Git 2.25.0 Setup建议放入D盘…

【消息队列】| 队列的优势介绍及应用场景

目录 &#x1f981; 前言&#x1f981; 那么MQ的优势在哪里&#xff1f;&#x1f981; 应用场景&#x1f981; 最后 &#x1f981; 前言 消息队列&#xff1a;MQ全称Message Queue&#xff08;消息队列&#xff09;&#xff0c;是在消息的传输过程中保存消息的容器。多用于系统…

javaweb课程设计——商城项目

前言&#xff1a; &#x1f44f;作者简介&#xff1a;我是笑霸final&#xff0c;一名热爱技术的在校学生。 &#x1f4dd;个人主页&#xff1a;个人主页1 || 笑霸final的主页2 &#x1f4d5;系列专栏&#xff1a;项目专栏 &#x1f4e7;如果文章知识点有错误的地方&#xff0c;…

2.2 动态范围的常用计算方法

1. 动态范围的常用计算方法 动态范围(Dynamic Range)指的是输入数据中数值的范围&#xff0c;计算动态范围是为了确定量化时使用的比特位数(还是抽象&#x1f602;)。个人理解:考虑到输入数据可能存在数据分布不均&#xff0c;即有些数据偏离过大。而过大的偏离值&#xff0c;会…

Ansys Zemax | NSC 非序列矢高图用户分析

本文介绍如何使用 NSC 矢高图用户分析功能在非序列模式下测量和显示对象的矢高。了解此功能的基础知识&#xff0c;包括如何设置复杂 CAD 零件的文件以获取特定面的矢高值。&#xff08;联系我们获取文章附件&#xff09; 介绍 OptocStudio 的序列模式具有表面矢高分析功能&…

硬件系统工程师宝典(28)-----关于LDO,应该知道的事

各位同学大家好&#xff0c;欢迎继续做客电子工程学习圈&#xff0c;今天我们继续来讲这本书&#xff0c;硬件系统工程师宝典。上篇我们说到BJT配合MOSFET控制电源开关的四种电路以及MOSFET的均流电路。今天我们来讲讲LDO的应用分析。 LDO的结构 LDO&#xff08;Low Dropout R…

Linux内核源码的配置和编译

目录 配置交叉编译工具链 读README 配置内核源码支持当前的硬件平台 驱动配置 内核编译 编译&#xff1a; 问题&#xff1a; 解决问题的方法&#xff1a; 测试内核 配置交叉编译工具链 打开内核源码顶层目录的Makefile&#xff0c; hqUbuntu:~/fs6818_uboot/kernel-3.4.39$ vi …

IP地址、子网划分

目录 一、IP地址1.IP地址表示2.分类IP地址3.无分类编址 CIDR4.特殊IP地址 二、子网划分1.子网、子网掩码、子网划分VLSM2.网络地址、广播地址3.示例1&#xff1a;等分为两个子网3.1 划分前&#xff1a;3.2 划分后&#xff1a; 4.示例2&#xff1a;等分为四个子网3.1 划分前&…

五种经典IO模型详解

目录 同步和异步同步阻塞IO模型基本概念应用场景优缺点 同步非阻塞IO模型基本概念应用场景优缺点 IO多路复用模型信号驱动IO模型回顾复习1.信号2.产生信号的条件3.可重入函数4.为什么中断处理函数不能直接调用不可重入函数5.如何写出可重入的函数 基本概念应用场景优缺点 异步I…

【操作系统】 1、计算机系统概述

1.1 操作系统的基本概念 从操作系统的角度上来划分计算机体系结构&#xff1a; 这里注意一点&#xff1a; 编译器属于应用程序。 操作系统&#xff1a;是指控制和管理计算机系统的 硬件 和软件 资源&#xff0c;合理的组织、调度计算机的工作与资源分配&#xff0c;进而为用…

对象数组练习案例

定义一个长度为3的数组&#xff0c;数组存储1~3名学生对象作为初始数据&#xff0c;学生对象的学号&#xff0c;姓名各不相同。 * 学生的属性&#xff1a;学号、姓名、年龄 * 要求1&#xff1a;再次添加一个学生对象&#xff0c;并在添加的时候进行学号的唯一性判断 * 要求2&am…

Nautilus Chain:我们将支持EIP6969

在今年 5 月初&#xff0c;以太坊核心开发者、Slingshot 的 CTO zkCole 提出了一个通用的协议标准 EIP-6969 &#xff0c;其旨在实现合约保护收入&#xff08;在以太坊 L2 上引入 / 标准化 CSR &#xff09;&#xff0c;该提案可以看作是之前 EIP-1559的改进版&#xff0c;并在…

Record类浅喽一眼~

Record类的一点小概念嗷。 一. 基本使用 java19 的新特性: 我们先构造一个student的Record类. 默认构造几个属性. public record Student(Integer id,String name, String email,Integer age) {} 然后简单搞一点例子 public static void main(String[] args) { St…

2023年上半年系统分析师上午真题及答案解析

1.信息系统的构成包括( )。 A.计算机硬件、计算机软件、网络和通信设备、系统分析人员、系统设计人员、系统开发人员 B.计算机硬件、计算机软件、系统分析人员、系统设计人员、系统开发人员 C.计算机硬件、计算机软件、系统设计人员、系统开发人员、信息用户 D.计算机硬件…