程序员代码面试指南题目解析(一)

        题目一:如何仅用递归函数和栈操作逆序一个栈

      题目要求:

    一个栈依次压入 1、2、3、4、5,那么从栈顶到栈底分别为5、4、3、2、1。将这个栈
转置后,从栈顶到栈底为 1、2、3、4、5,也就是实现栈中元素的逆序,但是只能用递归函数来实现,不能用其他数据结构。

      题目解析:

   根据题目要求,我们需要使用递归函数,依次将栈中的元素进行逆置出来。我们可以根据递归函数所可能产生的影响进行问题的解决。

   由于递归函数在递归的结束的时候可以进行返回,所以我们如果拿到一个数据并删除的话,在最后返回的时候会拿到最后一个数据。所进行的操作如下:

  如果想要将数组进行逆序仅仅拿到最后一个数据是完全不够的,我们还需要思考如何将一个数组进行逆序,这个思路其实很简单。我们可以再次使用一次递归操作,每次拿出最下面的数据,并保存,之后我们递归返回的时候就可以拿到最上面的数据了。我们将数据依次压入栈中就会得到一个逆序的栈。

    根据上述思路我们可以设计两个递归函数实现栈的逆序操作,实现代码如下:

#include<iostream>
#include<stack>
using namespace std;int getAndRemoveLastElem(stack<int>& sk)
{int result = sk.top();sk.pop();if (sk.empty()){return result;}else{//继续进行递归删除操作int last = getAndRemoveLastElem(sk);sk.push(result);return last;}
}//最后通过调用递归函数
void StackReverseStack(stack<int>& sk)
{if (sk.empty()){return;}int i = getAndRemoveLastElem(sk);StackReverseStack(sk);sk.push(i);
}int main()
{stack<int> ret;ret.push(1);ret.push(2);ret.push(3);ret.push(4);ret.push(5);StackReverseStack(ret);//之后打印输出栈当中的内容检查逆序的状况while (!ret.empty()){cout << ret.top() << endl;ret.pop();}return 0;
}

        题目二:用栈来求解汉诺塔问题

      题目要求: 
   汉诺塔问题比较经典,这里修改一下游戏规则:现在限制不能从最左侧的塔直接移动
到最右侧,也不能从最右侧直接移动到最左侧,而是必须经过中间。求当塔有 N层的时候,需要最少移动多少步。

    题目解析:

    这道题我们可以将其认为是一个简单的模拟类的题目,首先我们来分析问题:

    题目当中要求我们所进行的移动的步数是最少的,因此不允许由连续的可逆的步骤存在。例如:上一步从左到中间进行移动,下一步就从中间到左进行移动。这样上一步移动的步骤就是完全没有效果的,不可能是最少的移动次数。

   其次,题目当中要求我们在移动的时候必须经过中间,因此我们可以判断,当两个柱子进行移动完成之后(其中一个柱子一定是中间的柱子)一定是中间的柱子和另外一个没有进行移动的柱子进行移动操作,无非就是从中间移动到目标位置,或者从目标位置移动到中间。我们只需要符合汉诺塔的规则即可,也就是小的数据必须在大的数据之上才可以进行移动。所进行的示例如下:

    我们可以设置两个变量用于作为记录两个变化的柱子的情况,之后排除中间的柱子,让另一根柱子跟中间柱子进行数据的移动即可。根据上述思路我们可以写出如下代码:

#include<iostream>
#include<stack>
#include<vector>
#include<string>
using namespace std;
//使用栈进行解决汉诺塔问题
int stackSloveHanio(int data)
{stack<int> left;while (data){left.push(data);data--;}stack<int> mid;stack<int> right;//经过第一次初始化之后进行统一的数据操作int from = 1;int to = 2;     //使用1,2,3表示左中右三个柱子int x = left.top();left.pop();mid.push(x);int count = 1;//之后检查三个柱子的情况得到最终想要的结果while (!left.empty() || !mid.empty()){//当左边跟中间的柱子都不为空的时候就继续循环查找新的初始情况//由判断可知,我们的from和to无论怎么移动一定与中间柱子有关,//因此我们只需要查找中间柱子跟另外一个没有用到的柱子的移动方向即可int tmp = from;if (from == 2){tmp = to;}if (tmp == 1)  //下一次进行的操作就需要是从另外一个柱子跟中间柱子移动数据{//判断3柱子移动到中间,还是从中间移动到3柱子if (!right.empty()&&(mid.empty() || right.top() < mid.top())){//从3移动到2mid.push(right.top());right.pop();from = 3;to = 2;}else{//从2移动到3right.push(mid.top());mid.pop();from = 2;to = 3;}count++;}if (tmp == 3){//同理可得if (!left.empty()&&(mid.empty() || left.top() < mid.top())){mid.push(left.top());left.pop();from = 1;to = 2;}else{left.push(mid.top());mid.pop();from = 2;to = 1;}count++;}}return count;
}
int main()
{cout<<stackSloveHanio(3);return 0;
}

        题目三:生成窗口最大值数组

      题目要求:
  有一个整型数组 arr 和一个大小为 w 的窗口从数组的最左边滑到最右边,窗口每次向
右边滑一个位置。
例如,数组为[4,3,5,4.3,3,6,7],窗口大小为 3 时:
[4 3 5] 4 3 3 6 7          窗口中最大值为 5
4 [3 5 4] 3 3 6 7          窗口中最大值为 5
4 3 [5 4 3] 3 6 7          窗口中最大值为 5
4 3 5 14 3 3] 6 7         窗口中最大值为 4
4 3 5 4 [3 3 6] 7          窗口中最大值为 6
4 3 5 4 3 [3 6 7]          窗口中最大值为 7
如果数组长度为 n,窗口大小为 w,则一共产生 n-w+1 个窗口的最大值。

请实现一个函数。
•输入:整型数组 arr,窗口大小为 w.
•输出:一个长度为 n-W+1 的数组 res,res[i]表示每一种窗口状态下的最大值。
以本题为例,结果应该返回{5,5,5,4,6,7}。

     题目解析:

   这道题目实际上想要让我们进行的操作也就是根据指定的窗口依次选出窗口内元素的最大值。拿到这道题目的时候我们首先会有一个思路:直接进行模拟不久行了嘛,每次有新的数据进入窗口的时候进行一次遍历,得到最大的值,加入到数组当中。但是我们来思考一下时间复杂度:每一次遍历窗口一遍,假设窗口的大小为M,数据总共N个,所以我们总的时间复杂度为O(MN)这并不是一个很好的算法,因此我们需要进行优化。

  书中有一个很奇妙的思想:试想一下,在我们的窗口当中有新加入的元素,当新加入的元素较大的时候前面较小的元素就不可能是最大的元素,我们可以直接前面较小的数据删除。当新加入的数据较小的时候,当前面较大的数据删除之后,那么这个暂时较小的数据就有可能是最大的了。所以我们需要将数据保存。

  借助双端队列进行优化我们的代码。我们可以进行一次数组遍历,当队列为空或者新数据小于队列尾部的数据的时候可以直接将数据的下标加入到队列的尾部,当新数据大于队列尾部的数据的时候,直接将队列尾部的数据进行弹出数据。知道队列当中的数据大于新数据或者队列为空为止。所要进行的操作如下:

    需要注意的是:由于为了方便我们判断数据的加入以及输出的边界条件,因此我们需要将数组的下标作为加入队列的元素。当我们的队头元素小于我们窗口最左侧元素的下标的时候就说明数据已经失效,需要将队头数据删除,获得下一个窗口当中最大的元素。根据上述思路我们可以编写出如下的代码:

#include<iostream>
#include<vector>
#include<queue>
using namespace std;//编写一个函数,用于查找生成窗口最大值的数组
vector<int> createMaxWindow(vector<int> ret, int windows)
{//我们需要借助一个栈进行解决这个问题deque<int> dq;vector<int> finEnd;int count = windows;//进行数据的遍历操作,将我们数组当中的内容的下标依次放到栈当中,如果之后进入的数据大于之前的数据//就直接进行入栈操作,否则需要先执行出栈操作,等到满足小于之前的元素的时候就可以执行入栈操作了for (int i=0;i<ret.size();i++){while (!dq.empty()&&ret[i]>ret[dq.front()]){dq.pop_back();}dq.push_back(i);//之前向栈当中插入的元素还不满,不能直接进行记录最大值if ( count== 1){//进行检查并返回最大值,检查栈顶的最大值是否过期while (i - windows >= dq.front()){dq.pop_front();    //删除过期的最大值}//找到不过期的数据直接进行记录队头元素finEnd.push_back(ret[dq.front()]);}else{count--;}}return finEnd;
}int main()
{//进行测试最大生成窗口代码vector<int> ret({ 1,2,3,4,5,6,7,8,9 });vector<int> tmp=createMaxWindow(ret, 5);for (auto e : tmp){cout << e << " ";}return 0;
}

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

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

相关文章

【吴恩达机器学习-week2】多个变量的线性回归问题

文章目录 1.1 目标2 问题陈述2.1 包含我们示例的矩阵 X2.2 参数向量 w \mathbf{w} w 和 b b b 3 使用多个变量进行模型预测3.1 逐元素单独预测3.2 单一预测&#xff0c;向量 4 使用多个变量计算成本5 使用多个变量的梯度下降5.1 使用多个变量计算梯度 多个变量的梯度下降小结…

搜歌网搜索各种类型音乐,统统歌曲转换格式mp3,轻松实现音乐自由!

在互联网的广阔天地中&#xff0c;音乐爱好者们总能找到满足自己需求的平台。其中&#xff0c;支持全网搜歌的网站无疑是一个值得推荐的音乐探索乐园。无论是寻找经典老歌&#xff0c;还是发掘新兴音乐&#xff0c;搜他们都能为音乐爱好者提供一站式的服务。 一般支持全网搜索…

值得收藏!!《软考信息处理技术员》必背100母题,轻松45+

距离软考考试的时间越来越近了&#xff0c;趁着这两周赶紧准备起来 今天给大家整理了——软考信息处理技术员100道经典母题&#xff0c;年年从里面抽&#xff0c;有PDF&#xff0c;可打印&#xff0c;每天刷几道。 第一章 电脑的基本操作 1、&#xff08; &#xff09;不是国产…

Linux线程(二)线程互斥

目录 一、为什么需要线程互斥 二、线程互斥的必要性 三、票务问题举例&#xff08;多个线程并发的操作共享变量引发问题&#xff09; 四、互斥锁的用法 1.互斥锁的原理 2、互斥锁的使用 1、初始化互斥锁 2、加锁和解锁 3、销毁互斥锁&#xff08;动态分配时需要&#…

RFID在汽车制造中的应用如何改变行业

随着工业4.0和中国制造2025的推进&#xff0c;企业对于智能化、自动化的需求日益增长&#xff0c;RFID射频技术在制造业中已经相当普遍了。在如今这瞬息万变的行业与时代中&#xff0c;RFID技术可以帮助企业获得竞争优势&#xff0c;简化日益复杂的生产流程&#xff0c;推动企业…

C语言实战项目---通讯录

项目要实现的内容&#xff1a;能够存放100个人的通讯录程序&#xff0c;能够实现联系人数据的存储&#xff0c;删除&#xff0c;修改&#xff0c;查找&#xff0c;展示联系人的信息。 所需知识&#xff1a;结构体&#xff0c;指针&#xff0c;函数................. 废话不多…

2016-2021年全国范围的2.5m分辨率的建筑屋顶数据

一、论文介绍 摘要&#xff1a;大规模且多年的建筑屋顶面积&#xff08;BRA&#xff09;地图对于解决政策决策和可持续发展至关重要。此外&#xff0c;作为人类活动的细粒度指标&#xff0c;BRA可以为城市规划和能源模型提供帮助&#xff0c;为人类福祉带来好处。然而&#xf…

Qt之常用控件一

Widget常见属性及其作用 属性作用enabled 设置控件是否可使⽤. true 表⽰可⽤, false 表⽰禁⽤ geometry 位置和尺⼨. 包含 x, y, width, height 四个部分. 其中坐标是以⽗元素为参考进⾏设置的. windowTitle 设置 widget 标题 windowIcon 设置 widget 图标 windowOpa…

java日历类概述

Java中的Calendar类位于java.util包下&#xff0c;它是一个抽象类&#xff0c;用于表示和管理日期及时间。Calendar类并不是直接实例化的&#xff0c;而是通过其提供的静态方法来获取实例。通常情况下&#xff0c;当你尝试创建一个Calendar实例时&#xff0c;实际上你得到的是G…

The 2023 ICPC Asia Hefei Regional Contest

目录 B. Queue Sorting 应该还会再补几题 B. Queue Sorting 题解&#xff1a; Dilworth定理: 【偏序关系与偏序集、Hasse图、极大元、极小元、全序关系、最大元、良序集/三小时讲不完离散数学之集合论/考研复试/期末复习考前冲刺/近世代数/抽象代数】https://www.bilibili.c…

C++奇迹之旅:string类对象的容量操作

文章目录 &#x1f4dd; string类的常用接口&#x1f309; string类对象的容量操作&#x1f320;size&#x1f320;length&#x1f320;capacity&#x1f320;clear&#x1f320;empty&#x1f320;reserve&#x1f309;resize &#x1f6a9;总结 &#x1f4dd; string类的常用…

PMP有效期三年后,还有必要续证吗?

通常情况下是必要的&#xff0c;续证条件是在3年内累积60个PDU和支付150美元。如果到期后没有进行续证&#xff0c;但仍希望保持证书&#xff0c;就需要重新参加PMP考试。重新参加考试的费用包括3900元的报名费和数千元的培训费。因此&#xff0c;与重新考试相比&#xff0c;续…

通过 Java 操作 redis -- 基本通用命令

目录 使用 String 类型的 get 和 set 方法 使用通用命令 exists &#xff0c;del 使用通用命令 keys 使用通用命令 expire,ttl 使用通用命令 type 要想通过 Java 操作 redis&#xff0c;首先要连接上 redis 服务器&#xff0c;推荐看通过 Java 操作 redis -- 连接 redis 关…

思维导图在线怎么制作?推荐这些工具

思维导图在线怎么制作&#xff1f;在如今的快节奏时代中&#xff0c;思维导图作为一种高效的信息组织与思考工具&#xff0c;受到了广泛的应用。在线制作思维导图成打破了时间和空间的限制&#xff0c;使得团队协作变得更加便捷&#xff0c;个人创作也更为灵活。以下是四款备受…

建模电梯的状态图和学生选课ER图

第一题 尝试建模电梯的状态图&#xff08;选做&#xff09; 第二题 学校规定&#xff1a; 一个学生可选修多门课&#xff0c;一门课有若于学生选修。 一个教师可讲授多门课&#xff0c;一门课只有一个教师讲授。 一个学生选修一门课&#xff0c;仅有一个成绩。 学生的属性有学号…

JS中的arguments是什么?

arguments是当我们不确定有多少个参数传递时&#xff0c;就可以使用argument来获取。在js中&#xff0c;arguments实际上就是当前函数的一个内置对象&#xff0c;存储了我们传递的所有实参。arguents的展示形式就是一个伪数组&#xff0c;所以我们可以对它进行遍历。 我们先来…

基于Python的飞机大战游戏

学习目标 了解 飞机大战游戏的规则 理解 面向对象思想,会独立设计游戏的类与模块 掌握 pygame模块的使用 1.1 游戏介绍 飞机大战是一款由腾讯公司微信团队推出的软件内置的小游戏,这款游戏画面简洁有趣,规则简单易懂,操作简便易上手,在移动应用兴起之初曾风靡一时。 1.1.…

oracle 9i 行头带有scn的表

oracle 9i 行头带有scn的表 conn scott/tiger drop table t1; drop table t2; create table t1(c varchar2(5)); create table t2(c varchar2(6)) ROWDEPENDENCIES; --t2表每行都有scn,会增加六个字节的开销 alter table t1 pctfree 0; alter table t2 pctfree 0; insert in…

WordPress原创插件:超链接点击访问统计

WordPress原创插件&#xff1a;超链接点击访问统计 https://download.csdn.net/download/huayula/89296775

【Ajax零基础教程】-----第四课 简单实现

一、XMLHttpRequest对象 通过XMLHttpRequest对象来向服务器发送异步请求&#xff0c;从服务器获取数据。然后用JavaScript来操作DOM而更新页面。XMLHttpRequest是ajax的核心机制&#xff0c;它是IE5中首先引入的&#xff0c;是一种支持异步请求的技术。 简单的说&#xff0c;也…