谷歌(Google)技术面试——在线评估问题(三)

news2025/1/18 18:48:53

谷歌(Google)面试过程的第一步,你可能会收到一个在线评估链接。 评估有效期为 7 天,包含两个编码问题,需要在一小时内完成。 以下是一些供你练习的在线评估问题

在本章结尾处,还提供了有关 Google 面试不同阶段的更多详细信息。

最长同值路径

给定一个二叉树的 root ,返回 最长的路径的长度 ,这个路径中的 每个节点具有相同值 。 这条路径可以经过也可以不经过根节点。

两个节点之间的路径长度 由它们之间的边数表示。

示例 1:
在这里插入图片描述

输入:root = [5,4,5,1,1,5]
输出:2

示例 2:
在这里插入图片描述

输入:root = [1,4,5,4,4,5]
输出:2

提示:

  • 树的节点数的范围是 [0, 104]
  • -1000 <= Node.val <= 1000
  • 树的深度将不超过 1000

思路一:递归

首先,我们可以使用递归来解决这个问题。具体来说,对于每个节点,递归计算其左右子树中与当前节点值相同的路径的长度,然后返回左右子树中较长的路径长度加上当前节点的路径长度。这样就可以得到以当前节点为根节点的最长路径长度。在递归的过程中,可以用一个全局变量来记录最长的路径长度。

代码示例1

class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right

class Solution:
    def longestUnivaluePath(self, root):
        self.max_length = 0

        def dfs(node):
            if not node:
                return 0
            left_length = dfs(node.left)
            right_length = dfs(node.right)
            left_arrow = right_arrow = 0
            if node.left and node.left.val == node.val:
                left_arrow = left_length + 1
            if node.right and node.right.val == node.val:
                right_arrow = right_length + 1
            self.max_length = max(self.max_length, left_arrow + right_arrow)
            return max(left_arrow, right_arrow)
        
        dfs(root)
        return self.max_length

# 示例 1
root1 = TreeNode(5)
root1.left = TreeNode(4)
root1.right = TreeNode(5)
root1.left.left = TreeNode(1)
root1.left.right = TreeNode(1)
root1.right.right = TreeNode(5)
print(Solution().longestUnivaluePath(root1)) # 输出:2

# 示例 2
root2 = TreeNode(1)
root2.left = TreeNode(4)
root2.right = TreeNode(5)
root2.left.left = TreeNode(4)
root2.left.right = TreeNode(4)
root2.right.right = TreeNode(5)
print(Solution().longestUnivaluePath(root2)) # 输出:2

这个解决方案使用了一个嵌套的辅助函数 dfs() 来递归地计算每个节点的最长路径长度。在递归的过程中,如果当前节点的值与其左子节点值或右子节点值相等,则可以从左右子树中延伸路径。然后将左右子树中较长的路径长度加上当前节点的路径长度,得到以当前节点为根节点的最长路径长度,并更新全局变量 max_length

思路二:深度优先搜索(DFS)

第二种解决这个问题的方法是使用深度优先搜索(DFS),但稍微修改一下递归函数的返回值。在这种方法中,递归函数返回一个元组 (path_length, arrow_length),其中 path_length 表示以当前节点为根的最长路径长度,而 arrow_length 表示从当前节点出发向左或向右延伸的最长箭头长度。然后通过不断更新全局变量 max_length 来计算最终的结果。

代码示例2

class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right

class Solution:
    def longestUnivaluePath(self, root):
        self.max_length = 0

        def dfs(node):
            if not node:
                return 0, 0
            left_length, left_arrow = dfs(node.left)
            right_length, right_arrow = dfs(node.right)
            left_path = right_path = 0
            if node.left and node.left.val == node.val:
                left_path = left_length + 1
            if node.right and node.right.val == node.val:
                right_path = right_length + 1
            path_length = left_path + right_path
            arrow_length = max(left_path, right_path)
            self.max_length = max(self.max_length, path_length)
            return path_length, arrow_length

        dfs(root)
        return self.max_length

# 示例 1
root1 = TreeNode(5)
root1.left = TreeNode(4)
root1.right = TreeNode(5)
root1.left.left = TreeNode(1)
root1.left.right = TreeNode(1)
root1.right.right = TreeNode(5)
print(Solution().longestUnivaluePath(root1)) # 输出:2

# 示例 2
root2 = TreeNode(1)
root2.left = TreeNode(4)
root2.right = TreeNode(5)
root2.left.left = TreeNode(4)
root2.left.right = TreeNode(4)
root2.right.right = TreeNode(5)
print(Solution().longestUnivaluePath(root2)) # 输出:2

在这个解决方案中,递归函数 dfs() 返回一个元组 (path_length, arrow_length),表示以当前节点为根的最长路径长度和从当前节点向左或向右延伸的最长箭头长度。在递归的过程中,通过更新全局变量 max_length 来计算最终结果。

思路三:广度优先搜索(BFS)

第三种解题思路是使用广度优先搜索(BFS),通过遍历树中的每个节点来计算最长路径。在每一步中,记录当前节点的值以及从根节点到该节点的路径长度。如果当前节点的值与其父节点的值相同,则更新当前节点的路径长度为父节点的路径长度加1,否则将当前节点的路径长度重置为1。然后根据当前节点的路径长度更新最长路径的值。这种方法遍历了树中的每个节点,时间复杂度较高,但在一些情况下可能是一种简单直观的解决方案。

代码示例3

class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right

class Solution:
    def longestUnivaluePath(self, root):
        if not root:
            return 0
        queue = [(root, 1)]  # 使用队列存储节点及其路径长度
        max_length = 0
        while queue:
            node, length = queue.pop(0)
            max_length = max(max_length, length)
            if node.left:
                if node.left.val == node.val:
                    queue.append((node.left, length + 1))
                else:
                    queue.append((node.left, 1))
            if node.right:
                if node.right.val == node.val:
                    queue.append((node.right, length + 1))
                else:
                    queue.append((node.right, 1))
        return max_length

# 示例 1
root1 = TreeNode(5)
root1.left = TreeNode(4)
root1.right = TreeNode(5)
root1.left.left = TreeNode(1)
root1.left.right = TreeNode(1)
root1.right.right = TreeNode(5)
print(Solution().longestUnivaluePath(root1)) # 输出:2

# 示例 2
root2 = TreeNode(1)
root2.left = TreeNode(4)
root2.right = TreeNode(5)
root2.left.left = TreeNode(4)
root2.left.right = TreeNode(4)
root2.right.right = TreeNode(5)
print(Solution().longestUnivaluePath(root2)) # 输出:2

这个解法利用了 BFS 遍历树的每个节点,并在遍历过程中记录当前节点的值以及从根节点到该节点的路径长度。如果当前节点的值与其父节点的值相同,则更新当前节点的路径长度为父节点的路径长度加1,否则将当前节点的路径长度重置为1。最后根据当前节点的路径长度更新最长路径的值。

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

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

相关文章

Python 爬虫基础——http请求和http响应

写本篇文章&#xff0c;我认为是能把自己所理解的内容分享出来&#xff0c;说不定就有和我一样有这样思维的共同者&#xff0c;希望本篇文章能帮助大家&#xff01;✨✨ 文章目录 一、 &#x1f308;python介绍和分析二、 &#x1f308;http请求三、 &#x1f308;http响应四、…

原型模式详解

原型模式简单的理解来说,就是复制品,用一个已经做好的成品作为原型,然后通过复制它得到新的产品。就好像细胞分裂一样。用Java来说,就是用对象创建对象,而不是通过类来创建对象。 原型模式的目的是从原型实例克隆出新的实例 ,对于那些有非常复杂的初始化过程的对象或者是…

核心API-Activiti7从入门到专家(3)

背景 今天的说的api&#xff0c;activiti7真有&#xff0c;但真不是这个&#xff1a; 这个是为了云服务&#xff0c;封装的一些api&#xff0c;以后我们还会逐步探讨&#xff0c;今天我们讨论的&#xff0c;是其真正的api&#xff0c;以前是这样的&#xff1a; 是的&#xff0…

【数据结构】——二叉树的递归实现,看完不再害怕递归

创作不易&#xff0c;感谢三连加支持&#xff1f;&#xff01; 一 递归理解 递归无非就是相信它&#xff0c;只有你相信它&#xff0c;你才能写好递归&#xff01;为什么&#xff1f;请往下看 在进入二叉树的实现之前&#xff0c;我们得先理解一遍递归&#xff0c;可能很多…

synchronized到底锁住的是谁?

我们使用synchronized关键字是用来实现线程同步的&#xff0c;当多个线程同时去争抢同一个资源的时候在资源上边加一个synchronized关键字&#xff0c;能够使得线程排队去完成操作。 synchronized到底锁定的是什么资源&#xff1f; 修饰方法非静态方法 &#xff0c;锁定的是方…

效果翻倍!如何巧用邮件营销提升ROI?

我们可以通过“优化邮件内容、优化发送策略、优化数据分析、提升用户体验”来提升邮件营销ROI。 邮件营销一直被认为是一种有效的数字营销策略&#xff0c;可以帮助企业与潜在客户和现有客户建立联系、推广产品和服务、提高品牌认知度并促进销售。但是&#xff0c;为了确保邮件…

【番外篇2】统计学-方差分析

方差分析 方差分析&#xff08;ANOVA&#xff09;是一种用于比较三个或三个以上组之间平均值是否有显著差异的统计方法。通俗地说&#xff0c;就是用来确定不同组之间的平均值是否有显著差异。 让我们通过一个简单的例子来解释方差分析&#xff1a; 假设你是一位教育工作者&a…

day04-MQ

1.初识MQ 1.1.同步和异步通讯 微服务间通讯有同步和异步两种方式&#xff1a; 同步通讯&#xff1a;就像打电话&#xff0c;需要实时响应。异步通讯&#xff1a;就像发邮件&#xff0c;不需要马上回复。 两种方式各有优劣&#xff0c;打电话可以立即得到响应&#xff0c;但是你…

【THM】Protocols and Servers 2(协议和服务器 2

介绍 协议和服务器房间涵盖了许多协议: 远程登录HTTP协议文件传输协议邮件传输协议POP3IMAP实现这些协议的服务器会受到不同类型的攻击。仅举几例,请考虑: 嗅探攻击(网络数据包捕获)中间人 ( MITM ) 攻击密码攻击(身份验证攻击)漏洞从安全的角度来看,我们始终需要思考…

易宝OA ExecuteSqlForDataSet SQL注入漏洞复现

0x01 产品简介 易宝OA系统是一种专门为企业和机构的日常办公工作提供服务的综合性软件平台,具有信息管理、 流程管理 、知识管理(档案和业务管理)、协同办公等多种功能。 0x02 漏洞概述 易宝OA ExecuteSqlForDataSet接口处存在SQL注入漏洞,未经身份认证的攻击者可以通过…

探秘采集脑电波!

原文来自微信公众号&#xff1a;工程师看海&#xff0c;与我联系&#xff1a;chunhou0820 看海原创视频教程&#xff1a;《运放秘籍》 大家好&#xff0c;我是工程师看海&#xff0c;原创文章欢迎点赞分享&#xff01; 什么是脑电波&#xff1f;脑电波能来干嘛&#xff1f;怎么…

Stable Diffusion扩散模型【详解】小白也能看懂!!

文章目录 1、Diffusion的整体过程2、加噪过程2.1 加噪的具体细节2.2 加噪过程的公式推导 3、去噪过程3.1 图像概率分布 4、损失函数5、 伪代码过程 此文涉及公式推导&#xff0c;需要参考这篇文章&#xff1a; Stable Diffusion扩散模型推导公式的基础知识 1、Diffusion的整体…

【C语言】【Leetcode】【递归】22. 括号生成

文章目录 题目思路代码实现 题目 链接: https://leetcode.cn/problems/generate-parentheses/description/ 思路 我们可以通过回溯递归算法求解 如果左括号数量不大于n&#xff0c;我们可以放一个左括号。 如果右括号数量小于左括号的数量&#xff0c;我们可以放一个右括号…

sky06笔记下

1.边沿检测 检测输入信号din的上升沿&#xff0c;并输出pulse module edge_check ( clk, rstn, din, pulse ); input wire clk,rstn; input wire din; output reg pulse;wire din_dly;always (posedge clk or negedge rstn)beginif(!rstn)din_dly < 1b0;elsedin_dly < d…

Rust egui(4) 增加自己的tab页面

如下图&#xff0c;增加一个Sins也面&#xff0c;里面添加一个配置组为Sin Paraemters&#xff0c;里面包含一个nums的参数&#xff0c;范围是1-1024&#xff0c;根据nums的数量&#xff0c;在Panel中画sin函数的line。 demo见&#xff1a;https://crazyskady.github.io/index.…

b站评论词频统计绘制词云图

一、评论爬取 在笔者之前的文章中&#xff0c;已经专门介绍了b站评论的爬取&#xff08;传送门&#xff09;&#xff0c;这里只对b站评论的文本数据做展示。如下图所示&#xff1a; 二、分词、去停用词、词频统计 Python中的Jieba分词作为应用广泛的分词工具之一&#xff0c;其…

51单片机实验01-点亮LED小灯

目录 一&#xff0c;软件下载 二&#xff0c;单片机概述 1&#xff0c;单片机内部资源 1&#xff09;flash 2&#xff09;ram 3&#xff09;sfr 2&#xff0c;51单片机 3&#xff0c;单片机最小系统 三&#xff0c;点亮最右边的小灯 1&#xff0c;指出满足小灯点亮的有…

关节驱动器 CANFD 通信协议

前言 睿尔曼关节采用了问答方式进行通信&#xff0c;控制器发出指令包&#xff0c;模块返回应答包。一个CAN 总线网络中允许有多个模块&#xff0c;所以每个模块都分配有一个 ID 号。控制器发出的控制指令中包含 ID 信息&#xff0c;只有匹配上 ID 号的模块才能完整接收这条指令…

数学知识--(质数,约数)

本文用于个人算法竞赛学习&#xff0c;仅供参考 目录 一.质数的判定 二.分解质因数 三.质数筛 1.朴素筛法 2.埃氏筛法 3.线性筛法 四.约数 1.求一个数的所有约数 2.约数个数和约数之和 3.欧几里得算法&#xff08;辗转相除法&#xff09;-- 求最大公约数 一.质数的判定 …

MVCC详细总结

简介 MVCC&#xff08;Multi-Version Concurrency Control&#xff09;是一种多版本并发控制机制&#xff0c;主要用于数据库管理系统中&#xff0c;实现对数据库的并发访问。在编程语言中&#xff0c;MVCC可以实现事务内存。 MVCC的特点是读不加锁&#xff0c;读写不冲突。MVC…