【1 day】C++算法练习 剑指Offer 09 30

1.剑指Offer 09 用栈实现队列

用两个栈实现一个队列,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )

解题思路:此时建立一个A栈和B栈,把A当做一个队列,栈顶为队尾,栈底为队顶,当数据要入队时,可以直接入A栈,当要删除队首时,就需要把A栈中的数据 全部转移到B栈当中,再删除B栈顶数据。

class CQueue {
public:
    //建立一个A栈和B栈
    stack<int> A ,B;
    CQueue() {}
    
    //队尾数据直接入A栈
    void appendTail(int value) {
        A.push(value);
    }
    
    //删除队首数据
    /*
    	当删除队首数据时,会遇到三种情况
    		第一是B栈不为空
    			B栈当中有数据,此时可以直接把B栈的栈顶数据读取返回,并
    			出栈。因为A栈中的数据是倒序进入B栈的,此时B栈栈顶的数值
    			就是队列的队首数据
    		第二是A栈为空
    			直接返回-1,因为队列当中没有数值
    		第三种A栈有数据,但是B栈为空
    			此时就需要把A栈中的数据倒序进入B栈,这样队列的队首数据
    			变成了B栈的栈顶数据。
    */
    int deleteHead() {
        int temp;
        if(!B.empty()){
            temp = B.top();//B栈顶部数据读取
            B.pop();//B栈的顶部数据出栈
            return temp;
        }
        if(!A.empty()){//A栈不为空的情况
            while(!A.empty()){//A栈中的数据倒序放进B栈
                temp = A.top();//读取栈顶数据
                B.push(temp);
                A.pop();
            }
        }else{//A栈为空的情况
            return -1;
        }
        temp = B.top();
        B.pop();
        return temp;
    }
};
2.剑指Offer 30 包含main函数的栈

定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。

解题思路:建立A栈和B栈,A栈进行正常操作而B栈作为一个辅助栈,第一个数据A栈和B栈都要入栈,从第二个数据开始,A栈依旧正常入栈,而对于辅助栈B栈来说,第二个数据要和此时B栈的栈顶数据进行比较,如果比栈顶数据小就进栈,如果不小就放弃进入辅助栈,以此往复。这样A栈的数据是正常进栈的,而B栈的栈顶元素一直是当前最小值。

class MinStack {
public:
    /** initialize your data structure here. */
    stack<int> A ,B;
    MinStack() {}
    void push(int x) {
        A.push(x);
        /*
        if(B.top()>=x || B.empty())  错误
        此处的判断条件必须是先判断B栈是否为空,否者会造成运行报错。
        报错提示为:Line 175: Char 16: runtime error: reference
        	 binding to misaligned address 0xbebebebebebec0ba for 
        	 type'int', which requires 4 byte alignment 
        原因是B栈在最开始中是为空的无法进行比较
        */
        if(B.empty() || B.top() >= x){
            B.push(x);
        }
    }
    
    void pop(){
       if(A.top() == B.top()){
       /*A栈要进行出栈操作时 要判断A栈和B栈的顶部元素数值是否相同,
       		如果相同则B栈的栈顶元素一样要出栈,要保持两者一致。
       */
            B.pop();
       }   
        A.pop();
    }
    
    int top() {
        return A.top();
    }
    
    int min() {//辅助栈B的栈顶元素一直就是最小值
        return B.top();    
    }
};
### 2023 年华为 OD 机试概述 华为 OD (Open Day) 是一种面向社会招聘和技术选拔的重要形式,旨在评估候选人的编程能力和解决问题的能力。该测试通常包含一系列算法设计、数据结构应用以及实际编码挑战。 #### 考试内容 考试主要集中在以下几个方面: - **基础算法数据结构**:包括但不限于数组操作、链表管理、栈队列实现等基本概念及其优化方案[^1]。 - **复杂度分析**:对于给定问题能够快速判断时间空间复杂度,并据此调整解决方案以提高效率[^2]。 - **动态规划** 和 **贪心策略** 的运用,在面对多阶段决策过程时找到最优解法。 - **字符串处理** 及其高级特性如正则表达式的匹配规则理解与灵活使用。 - **图论基础知识** 如最短路径计算(Dijkstra/Floyd-Warshall),最小生成树(Prim/Kruskal)。 #### 准备方法 为了更好地应对这些考核要点,建议采取如下措施来提升个人技能水平并熟悉考试环境: ```python def prepare_for_huawei_od(): study_plan = [ "深入学习Python/Java/C++中的任意一门主流语言", "掌握常用的数据结构和经典算法模板", "练习LeetCode上的中等到困难级别的题目至少每天一题", "阅读官方文档和其他高质量的技术博客文章" ] practice_resources = { '在线平台': ['牛客网', '力扣'], '书籍推荐': ["《剑指Offer》", "《编程之美》"] } return f"按照{study_plan}制定的学习计划执行,\n利用资源:{practice_resources}" ``` #### 经验分享 已经成功通过此轮筛选的同学总结了一些实用的小贴士供后来者参考: - 提前适应线上笔试工具的操作界面,确保网络连接稳定可靠[^3]。 - 认真审题,注意边界条件考虑全面;遇到难题先尝试简化版本再逐步完善思路。 - 编码过程中保持良好的变量命名习惯以便于调试检查逻辑错误。 - 尽量采用简洁明了的方式表述自己的想法,即使无法完全解决也可以获得部分分数的认可。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Unknown To Known

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值