Amazon 笔试 :公共祖先 问题

BAT级企业实习笔试通关指南:数据结构与算法实战 数据结构与算法是计算机科学的核心基础,其本质是通过特定结构组织数据,并设计高效操作逻辑。从数组、链表到树形结构,不同数据结构在时间复杂度与空间复杂度上各有优劣,例如哈希表能以O(1)时间复杂度实现快速查找,而二叉搜索树则适合维护有序数据集。在工程实践中,掌握动态规划、DFS/BFS等经典算法范式,能有效解决路径规划、资源优化等实际问题。针对互联网大厂技术笔试,本文特别整理2023年最新真题题库,包含字节跳动矩阵旋转、美团股票买卖等典型例题,通过四象限分析法和双指针技巧等热词方法论,帮助考生快速构建解题思维框 阅读详情

问题描述:

 

  算法分析:

    s1:层数对齐:分别求两个数所在的层(l1,l2),把层数大的(假设l2>l1)先往上找父节点,从而对齐到l1层;
    s2:两个数同时往上找, 直到找到公共的父节点(一定能找到,最坏情况下是0), 算法结束。

  因此算法的核心就变成了如何找父节点, 求父节点的分析:

    求父节点的时候,总是发现没有规律可循, 最重要的原因就是树中节点序号的增加是一个s型的路线,那么我们是利用这种特殊性

(s型),还是去除这种特殊性;我暂时没有发现如何利用这种特殊性, 所以我就先把树中节点的序号按从左到右的顺序递增,发现这样求

父节点的规律就很明显了,所以就采用了"去除这种特殊性"的方法。那么如何去除:每行中间位置上的节点的序号是有规律的,所以通过中

间数,和求得的父节点序号(不是真实的父节点序号, 如:17/3 == 5, 但实际上17的父节点是11,不是5),得到真实的父节点序号。

    用一个例子来说明, 比如求17的父节点序号:

  先直接求父节点序号(假的):17/3==5,求父节点所在层(2层)中间节点的序号为8, 所以真实的父节点序号是:8*2-5=11]

//File: Solution.java
//Author: lxw
//Time: 2014-10-09复制代码
//Usage: Get the common ancestor.
//Method: Align the layers of the 2 numbers. Decrease both of the layers to find the common ancestor.
//NOTE that each time the layer is decreased, we need to convert the number.

import java.util.*;
public class Solution{
    //I really do not think this function uses a good altorithm.
    private static int getLayer(int num){
        int res = 1;
        int last = 0;
        int next = 0;
        if(num == 0){
            return 0;
        }
        last = (int)((Math.pow(3, res) - 3.0) / 2.0);
        while(true){
            next = (int)((Math.pow(3, res+1) - 3.0) / 2.0);
            if(num > last && num <= next){
                return res;
            }
            ++res;
            last = next;
        }
    }

    private static int getMid(int layer){
        if(layer > 0){
            int sum = 0;
            for(int i = 1; i < layer; ++i){
                sum += Math.pow(3, i);
            }
            sum += (int)((Math.pow(3, layer) + 1.0) / 2.0);
            return sum;
        }
        else{
            return 0;
        }
    }

    //num2Lay >= num1Lay
    private static int getCommon(int num2Lay, int num1Lay, int num2, int num1){
        //层数对齐
        while(num1Lay != num2Lay){
            if(num2 % 3 == 0){
                --num2;
            }
            num2 /= 3;
            --num2Lay;
            //Each time the layer is decreased, we need to convert the number
            num2 = 2 * getMid(num2Lay) - num2;
        }

        //一起往上找父节点
        if(num2 == num1){
            return num1;    //final answer
        }
        else{
            while(num2 != num1){
                if(num2 % 3 == 0){
                    --num2;
                }
                if(num1 % 3 == 0){
                    --num1;
                }
                num2 /= 3;
                num1 /= 3;
                //Since num2Lay == num1Lay, only one of them is needed.
                //--num2Lay;
                --num1Lay;
                //Each time the layer is decreased, we need to convert the number.
                int mid = 2 * getMid(num1Lay);
                num2 = mid - num2;
                num1 = mid - num1;
            }
            return num1;
        }
    }

    public static void main(String[] args){
        Scanner in = new Scanner(System.in);
        int num1, num2, num1Lay, num2Lay;
        while(true){
            System.out.println("Input:");
            num1 = in.nextInt();
            num2 = in.nextInt();
            num1Lay = getLayer(num1);
            num2Lay = getLayer(num2);
            if(num1Lay < num2Lay){
                System.out.println(getCommon(num2Lay, num1Lay, num2, num1));
            }
            else{
                System.out.println(getCommon(num1Lay, num2Lay, num1, num2));
            }
            System.out.println();
        }
    }
}

春招算法刷题攻略:高效构建解题思维与高频考点解析 算法刷题是计算机科学中提升问题解决能力的重要方法,其核心在于通过模式识别和思维训练优化解题效率。从技术原理看,刷题本质是建立‘问题分类→解法联想→边界处理’的思维链路,这与动态规划、二叉树遍历等经典算法的设计思想高度契合。在实际工程场景中,如大厂面试或竞赛准备,科学的刷题方法能显著提升代码质量和解题速度。本文以二叉树题型为例,剖析路径问题、构造问题等高频模式,并结合时间复杂度优化、题型分布等维度,帮助开发者系统提升算法能力。通过专题突破和模拟面试等实践方法,可快速掌握二分查找、滑动窗口等关键技术,适用于春招 阅读详情

相关推荐

【考研】东北大学二叉树相关算法(1)

中序遍历对二叉树线索化的递归算法 void InThread(ThreadTree &P,ThreadTree &pre) { if(p!=null) { InThread(p->lchild,pre); if(lchild==null) { p->lchild=pre; p->lta

想当厨子的程序媛 5887

顺序存储的二叉树的最近的公共祖先问题

#include<iostream> using namespace std; const int N = 1003; int a[N]; int main() { int n; cin>>n; for (int i = 1; i <= n; i ++ ) cin>>a[i]; int x,y; cin>>x>>y; if(!a[x]) printf("ERROR: T[%d] i.

xqer6的博客 1374

LVDS高速ADC接口, xilinx fpga实现

FPGA实现lvds高速ADC数据接口,窗口对齐算法,Verilog源码

kuangxin的博客 6万+

7-3 顺序存储的二叉树的最近的公共祖先问题 (20分)

7-3 顺序存储的二叉树的最近的公共祖先问题 (20分) 设顺序存储的二叉树中有编号为i和j的两个结点,请设计算法求出它们最近的公共祖先结点的编号和值。 输入格式: 输入第1行给出正整数n(≤1000),即顺序存储的最大容量;第2行给出n个非负整数,其间以空格分隔。其中0代表二叉树中的空结点(如果第1个结点为0,则代表一棵空树);第3行给出一对结点编号i和j。 题目保证输入正确对应一棵二叉树,且1≤i,j≤n。 输出格式: 如果i或j对应的是空结点,则输出ERROR: T[x] is NULL,其中x是i或

rookielsj的博客 1794

igh ethercat 实时性测试

组备注std(us)max(us)a无锁核,无rt补丁8.38108b锁核+FIFO调度+内存锁定,无rt补丁0.9216c锁核+FIFO调度+内存锁定,+rt补丁0.9922可以看到 a组 使用ethercat不做其他优化,周期抖动非常大,且max能达到 100 多 us;通过 锁核+FIFO调度+内存锁定 进行优化,可以看到 抖动明显降低,且max 为 20 us 左右;

qq_43353632的博客 2309

【机电杂谈2】BLDC和PMSM的特点和区别

在日常生活中,小到电动玩具,大到电动汽车,永磁电机的身影可以说是无处不在。有刷直流电机、无刷直流电机、永磁同步电机由于其结构和输出特定的不同也被应用到不同的场合。如果你经常拆一些玩具和家电,就会看到大量的有刷直流电机和无刷直流电机,而永磁同步电机主要应用在高精度的工业伺服和电动汽车领域。本文就从电机的结构和控制方面,对这几种常见的永磁电机做简单的梳理和归纳。

2934

Linux单独编译设备树,开发者分享 | Petalinux 工程中设备树的介绍

本文来自XILINX嵌入式产品应用工程师 Terry Ni设备树是 Petalinux kernel 的关键组件,接下来以 2020.1 版本为例,为大家介绍一下在Xilinx Petalinux 工程中的设备树是如何产生,配置以及修改的。Petalinux 工程中设备树的位置当我们创建了一个 petalinux 工程后(以zcu102为例),在编译的时候,会自动生成对应的设备树文件。这些设备树的...

weixin_28877107的博客 2581

二叉树最近公共祖先算法详解:从递归到迭代的面试实战解析

二叉树是数据结构与算法中的核心基础,其遍历与搜索算法是解决众多计算问题的关键。深度优先搜索(DFS)和广度优先搜索(BFS)作为经典的图遍历思想,通过递归或迭代方式系统地访问节点,为路径查找、祖先关系判定等问题提供了通用框架。在工程实践中,高效地定位树中节点的特定关系,例如计算两个节点的最近公共祖先(LCA),对于优化数据库索引结构、加速编译器符号解析、乃至提升社交网络关系查询效率都具有重要价值。本文聚焦于这一高频面试考点,深入剖析利用递归分治与父指针映射两种主流方案求解LCA问题的核心原理与代码实现,并结

weixin_34075268的博客 759

【ARM Trace32(劳特巴赫) 使用介绍 10 -- Trace32 scan dump 详细介绍】

将图 1-2 中扫描单元按照扫描移位模式连接起来,就构成了扫描测试中的基本结构,这里介绍下全扫描。全扫描就是多个扫描单元相连接,上一单元的扫描输出,连接到目前单元的扫描输入,目前单元的扫描输出连接到下一单元的扫描输入,以此类推,构成一条移位寄存器链,如图1-3 所示:图 1-3 全扫描这样的扫描结构,可通过一个串行输入端,将期望的数据存入移位寄存器链并观察运行结果。

CodingCos的博客 2033

【产品经理修炼之道】- 优惠券系统从入门到精通(一)

为了满足企业的优惠券业务,优惠券系统一般需要包含哪些功能?这篇文章里,作者从架构、功能等维度做了拆解,一起来看看吧。此部分主要讲解为满足公司优惠券业务,需要优惠券系统必须包含哪些功能,即优惠券架构图。

xiaoli8748的专栏 1809

7-11 顺序存储的二叉树的最近的公共祖先问题 (25分)

致读者: 博主是一名数据科学与大数据专业大二的学生,真正的一个互联网萌新,写博客一方面是为了记录自己的学习过程中遇到的问题和思考,一方面是希望能够帮助到很多和自己一样处于困惑的读者。由于水平有限,博客中难免会有一些错误,有纰漏之处恳请各位大佬不吝赐教!之后会写大数据专业的文章哦。尽管现在我的水平可能还不太及格,但我会尽我自己所能,做到最好☺。——天地有正气,杂然赋流形。下则为河岳,上则为日星。 ...

ZZULI_星.夜 3226

华为OD机试双机位C卷:挑选宝石 (C/C++/Python/JAVA/JS/GO)

华为OD机试双机位C卷 挑选宝石,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解。华为OD机试-挑选宝石,华为OD机考-挑选宝石。

qq_45776114的博客 1500

7-1 顺序存储的二叉树的最近的公共祖先问题(25 分)

7-1 顺序存储的二叉树的最近的公共祖先问题(25 分)设顺序存储的二叉树中有编号为i和j的两个结点,请设计算法求出它们最近的公共祖先结点的编号和值。输入格式:输入第1行给出正整数n(≤1000),即顺序存储的最大容量;第2行给出n个非负整数,其间以空格分隔。其中0代表二叉树中的空结点(如果第1个结点为0,则代表一棵空树);第3行给出一对结点编号i和j。题目保证输入正确对应一棵二叉树,且1≤i,j...

matthew_leung的博客 1万+

《UDS协议从入门到精通》系列——图解0x38:请求文件传输

详细解释UDS协议中0x38-请求上传服务的各个参数!!

车载系统攻城狮 3263

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

【HBU】7-3 顺序存储的二叉树的最近的公共祖先问题 (20分)

题目描述 设顺序存储的二叉树中有编号为i和j的两个结点,请设计算法求出它们最近的公共祖先结点的编号和值。 输入格式: 输入第1行给出正整数n(≤1000),即顺序存储的最大容量;第2行给出n个非负整数,其间以空格分隔。其中0代表二叉树中的空结点(如果第1个结点为0,则代表一棵空树);第3行给出一对结点编号i和j。 题目保证输入正确对应一棵二叉树,且1≤i,j≤n。 输出格式: 如果i或j对应的是空结点,则输出ERROR: T[x] is NULL,其中x是i或j中先发现错误的那个编号;否则在一行中输出编号为

weixin_46014378的博客 1123

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

蓝桥杯训练——顺序存储的二叉树的最近的公共祖先问题

问题描述: 习题4.5 顺序存储的二叉树的最近的公共祖先问题(25 分) 设顺序存储的二叉树中有编号为i和j的两个结点,请设计算法求出它们最近的公共祖先结点的编号和值。 输入格式: 输入第1行给出正整数n(≤1000),即顺序存储的最大容量;第2行给出n个非负整数,其间以空格分隔。其中0代表二叉树中的空结点(如果第1个结点为0,则代表一棵空树);第3行给出一对结点编号i和j。 题目保证输

新生啸月的博客 1752

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

pat 顺序存储的二叉树的最近的公共祖先问题

pat 顺序存储的二叉树的最近的公共祖先问题  顺序存储的二叉树的最近的公共祖先问题   (25分) 设顺序存储的二叉树中有编号为ii和jj的两个结点,请设计算法求出它们最近的公共祖先结点的编号和值。 输入格式: 输入第1行给出正整数nn(\le 1000≤1000),即顺序存储的最大容量;第2行给出nn个非负整数,其间以空格分隔。其中0代表二叉树中的空结点(如果第1个

原点 1161

最近的公共祖先

最近的公共祖先 目录   一、引例       1、树-结点间最短距离 二、LCA(最近公共祖先)       1、朴素算法       2、步进法       3、记忆化步进法       4、tarjan算法       5、doubly算法 三、并查集        1、"并"和"查"        2、朴素算法        3、森林实现  

奋斗de穷小子 503

顺序存储二叉树的公共祖先问题

顺序存储二叉树的公共祖先问题

weixin_57849570的博客 2252

2020第12-14周练习——7-3 顺序存储的二叉树的最近的公共祖先问题 (20分)

设顺序存储的二叉树中有编号为i和j的两个结点,请设计算法求出它们最近的公共祖先结点的编号和值。 输入格式: 输入第1行给出正整数n(≤1000),即顺序存储的最大容量;第2行给出n个非负整数,其间以空格分隔。其中0代表二叉树中的空结点(如果第1个结点为0,则代表一棵空树);第3行给出一对结点编号i和j。 题目保证输入正确对应一棵二叉树,且1≤i,j≤n。 输出格式: 如果i或j对应的是空结点,则输出ERROR: T[x] is NULL,其中x是i或j中先发现错误的那个编号;否则在一行中输出编号为i和j的两

沃然 1202
上一篇: amazon 出栈 进栈 序列 题目
下一篇: amazon 笔试: 购物统计
大树叶
博客等级 码龄12年 1171粉丝 664原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值