腾讯电话面试

简介: 今天内推腾讯实习生一面 其中问道一个问题是,怎样在不消除递归的情况下防止栈溢出?(无论如何都要使用递归) 面试的时候,一点都不知道,只能说使用循环来消除,但是那样不满足要求,后来看看这篇博客http://blog.zhaojie.me/2009/03/tail-recursion-and-continuation.html 才懂了。

今天内推腾讯实习生一面

其中问道一个问题是,怎样在不消除递归的情况下防止栈溢出?(无论如何都要使用递归)

面试的时候,一点都不知道,只能说使用循环来消除,但是那样不满足要求,后来看看这篇博客http://blog.zhaojie.me/2009/03/tail-recursion-and-continuation.html 才懂了。

还有一个不知道的问题是优先队列的实现,原来没有接触过这种数据结构,所以当时想了半天也不知道。。

看《数据结构与算法分析——C语言描述》中有提到,结果发现是我自己没有理解题目的意思。

实现方式可以见连接:http://www.cnblogs.com/wuchanming/p/3809496.html

《编程之美》中有这样一个题目:

队列中取最大值操作问题,题目描述:

假设有这样一个拥有3个操作的队列:

1 Enqueue(v): 将v加入队列

2 DeQueue:使队列中的队首元素删除并返回此元素

3 MaxElement:返回队列中的最大元素

请设计一种数据结构和算法,让MaxElement操作的时间复杂度尽可能地低。

队列是遵守“先入先出”原则的一种复杂数据结构。其底层的数据结构不一定要用数组来实现,还可以使用其他特殊的数据结构来实现,以达到降低MaxElement操作复杂度的目的。

分析与解法:

解法一

这个问题的关键在于取最大值的操作,并且考虑但队列里面的元素动态增加和减少的时候,如何能够非常快速地把最大值取出。

虽然,最直接的思路就是按传统方式来实现队列。利用一个数组或链表来存储队列的元素,利用两个指针分别指向队列的队首和队尾。如果采用这种方法,那么MaxElement操作需要遍历队列的所有元素。在队列的长度为N的条件下,时间复杂度为O(N)。

解法二

根据取最大值的要求,可以考虑用最大堆来维护队列中的元素。堆中每个元素都有指针指向它的后续元素。这样,堆就可以很快实现返回最大元素的操作。同时,我们也能保证队列的正常插入和删除。MaxElement操作其实就是维护一个最大堆,其时间复杂度为O(1)。而入队和出队操作的时间复杂度为O(lgN)

开始不太能理解,后来想想好像是这样的,比如,队列是先进先出的,所以用一种数据结构来记录元素的进出顺序,而使用最大堆来维持找到最大值的效率。假如使用queue来存放所有的数据,当入队的时候直接插入队尾,而最大堆也需要将加入的值放在堆的最后,然后进行调整,直到满足最大堆。如果是进行访问最大值,可以直接访问堆顶的元素。如果是进行出队操作,从队列的首部删除该元素,并在最大堆中找到该元素,删除之后,进行调整。这样既能够达到满足队列的“先进先出”,也能满足在O(1)的条件下访问到最大值。

解法三

曾经做过一种类似的题目是最小栈,也就是在O(1)的情况下访问到栈中的最小元素。如是想到也可以使用这种方式来实现优先队列,

如果使用两个数组分别存放,第一个数组按进入的顺序存放所有的元素,另一个数组中存放最大值的下标,另外还用一个变量记录当前的最大值下标。

实现代码:

class stack
{
public:
    stack()
    {
        stackTop=-1;
        maxStackItemIndex=-1;
    }
    void push(Type x)
    {
        stackTop++;
        if(stackTop>=Max)
        ;  //栈满
        else
        {
            stackItem[stackTop]=x;
            if(x>Max())
            {
                link2NextMaxItem[stackTop]=maxStackItemIndex;
                maxStackItemIndex=stackTop;
            }
            else
                link2NextMaxItem[stackTop]=-1;
         }
    }
    Type Pop()
    {
        Type ret;
        if(stackTop<0)
            ThrowException();  //已经没有元素来,所以不能pop
        else
        {
            ret=stackItem[stackTop];
            if(stackTop==maxStackItemIndex)
            {
                maxStackItemIndex=link2NextMaxItem[stackTop];
            }
            stackTop--;
        }
        return ret;
    }
    Type Max()
    {
        if(maxStackItemIndex>=0)
            return stackItem[maxStackItemIndex];
        else
            return -INF;
    }
private:
    Type stackItem[MAXN];
    int stackTop;
    int link2NextMaxItem[MAXN];
    int maxStackItemIndex;
};

这里,维护一个最大值的序列来保证Max操作的时间复杂度为O(1),相当于用空间复杂度换取了时间复杂度。

如果能够用栈有效第实现队列,而栈的Max操作又很容易,那么队列的Max操作也就能有效地完成了。

相关文章
|
4月前
|
SQL Java 数据库连接
阿里腾讯互联网公司校招 Java 面试题总结及答案解析
本文总结了阿里巴巴和腾讯等互联网大厂的Java校招面试题及答案,涵盖Java基础、多线程、集合框架、数据库、Spring与MyBatis框架等内容。从数据类型、面向对象特性到异常处理,从线程安全到SQL优化,再到IOC原理与MyBatis结果封装,全面梳理常见考点。通过详细解析,帮助求职者系统掌握Java核心知识,为校招做好充分准备。资源链接:[点击下载](https://pan.quark.cn/s/14fcf913bae6)。
125 2
|
数据采集 数据挖掘 关系型数据库
2024年5分钟就能完成的5个Python小项目,赶紧拿去玩玩吧(2),2024年最新腾讯面试题
2024年5分钟就能完成的5个Python小项目,赶紧拿去玩玩吧(2),2024年最新腾讯面试题
2024年5分钟就能完成的5个Python小项目,赶紧拿去玩玩吧(2),2024年最新腾讯面试题
|
算法 前端开发 Java
数据结构与算法学习四:单链表面试题,新浪、腾讯【有难度】、百度面试题
这篇文章总结了单链表的常见面试题,并提供了详细的问题分析、思路分析以及Java代码实现,包括求单链表中有效节点的个数、查找单链表中的倒数第k个节点、单链表的反转以及从尾到头打印单链表等题目。
136 1
数据结构与算法学习四:单链表面试题,新浪、腾讯【有难度】、百度面试题
|
12月前
|
负载均衡 算法 Java
腾讯面试:说说6大Nginx负载均衡?手写一下权重轮询策略?
尼恩,一位资深架构师,分享了关于负载均衡及其策略的深入解析,特别是基于权重的负载均衡策略。文章不仅介绍了Nginx的五大负载均衡策略,如轮询、加权轮询、IP哈希、最少连接数等,还提供了手写加权轮询算法的Java实现示例。通过这些内容,尼恩帮助读者系统化理解负载均衡技术,提升面试竞争力,实现技术上的“肌肉展示”。此外,他还提供了丰富的技术资料和面试指导,助力求职者在大厂面试中脱颖而出。
腾讯面试:说说6大Nginx负载均衡?手写一下权重轮询策略?
|
XML 存储 Android开发
Android技能树 — Fragment总体小结,2024年最新腾讯面试gm
Android技能树 — Fragment总体小结,2024年最新腾讯面试gm
|
Python
155. 最小栈 力扣 python 空间换时间 o(1) 腾讯面试题
155. 最小栈 力扣 python 空间换时间 o(1) 腾讯面试题
164 0
|
消息中间件 监控 Java
腾讯面试:如何提升Kafka吞吐量?
Kafka 是一个分布式流处理平台和消息系统,用于构建实时数据管道和流应用。它最初由 LinkedIn 开发,后来成为 Apache 软件基金会的顶级项目。 Kafka 特点是**高吞吐量、分布式架构、支持持久化、集群水平扩展和消费组消息消费**,具体来说: 1. **高吞吐量**:Kafka 具有高性能和低延迟的特性,能够处理大规模数据,并支持每秒数百万条消息的高吞吐量。 2. **分布式架构**:Kafka 采用分布式架构,可以水平扩展,多个节点之间能够实现负载均衡和高可用性。 3. **可持久化**:Kafka 将消息持久化到磁盘中,保证消息的可靠性,即使消费者下线或出现故障,消
191 0
|
Android开发
Android Jetpack架构开发组件化应用实战,字节跳动+阿里+华为+腾讯等大厂Android面试题
Android Jetpack架构开发组件化应用实战,字节跳动+阿里+华为+腾讯等大厂Android面试题
|
算法 架构师 网络协议
对标腾讯T9架构师的 Android 面试题新鲜出炉,算法真的太重要了
对标腾讯T9架构师的 Android 面试题新鲜出炉,算法真的太重要了
|
Android开发
Android热补丁动态修复实践,腾讯&字节&网易&华为Android面试题分享
Android热补丁动态修复实践,腾讯&字节&网易&华为Android面试题分享