数据结构与算法(Java版) | 就让我们来看看几个实际编程中遇到的问题吧!
创始人
2024-05-26 01:16:17
0

上一讲,我给大家简单介绍了一下数据结构,以及数据结构与算法之间的关系,照理来说,接下来我就应该要给大家详细介绍线性结构和非线性结构了,但是在此之前,我决定还是先带着大家看几个实际编程中遇到的问题,看完之后咱们再说。

第一个问题:一个有关单链表的面试题

如下所示,有这样一段Java代码,我想这段Java代码大家应该都能看得懂吧!无非就是使用字符串类的replaceAll方法将指定字符串中的Java子串全部替换成了李阿昀~,So Easy!replaceAll方法大家应该都见过吧!它就是用来做字符串替换的。

public static void main(String[] args) {String str = "Java, Java, hello, world!";String newStr = str.replaceAll("Java", "李阿昀~"); // 算法System.out.println("newStr = " + newStr);
}

那么,我现在就要问大家了,replaceAll方法的提供者在进行字符串替换时,它到底是怎么做的呢?想都不用想,里面必定会有一个算法来做支撑,就是,而且这个算法你还要能看得懂,否则,坏事势必就会频发,你想啊,我们去开发一个程序,如果你连别人底层的代码都看不懂,那么你自己去优化程序不就是成无稽之谈了嘛!

总之,replaceAll方法内部有一个算法,而且它是专门来研究字符串是如何进行替换的。

接下来,我们不妨来看一个有关单链表的面试题。

试写出用单链表表示的字符串类及字符串结点类的定义,并依次实现它的构造函数,以及计算串长度、串赋值、判断两串相等、求子串、两串连接、求子串在串中位置等7个成员函数。

注意,以上题目中有个函数的概念,而它其实就是我们Java里面的方法。

想必大家在大学里面学数据结构时,老师一定给你们布置过很多的练习题吧!而这其中不乏就有关于链表的练习题,而且初看还具有一定难度,例如以上那道有关单链表的面试题,你应该遇到过这样的练习题吧,要是没遇到过,那我想你的数据结构一定没学好,因为学数据结构你不大量的练习,你怎么学得好啊!

还是说回来上面那道有关单链表的面试题,其实这道面试题要求很明确,就是用单链表来实现字符串类的相关功能,而单链表正是数据结构中的一种,如果你没有学过单链表这种数据结构,那么这道面试题很显然你就完成不了。总之,这道面试题必须建立在大家对单链表了解的基础上才能完成得了。

第二个问题:一个五子棋程序

接下来,我们来看一个比较经典的、同学们也玩过的游戏,即五子棋程序。

在这里插入图片描述

从上图中,能看到一个五子棋程序最基本的要求有:

  1. 判断游戏的输赢,不管是黑子赢也好,还是蓝子赢也好。

    相信大家都知道五子棋游戏输赢的规则吧!很简单,就是看哪一方先把5颗子下得粘成一串,谁先就谁赢。于是,你是不是得要写个算法来判断游戏输赢啊!

  2. 存盘退出。

  3. 继续上局。

  4. 悔棋。

    就是这一步我不满意,我要悔一步棋。

大家想一下,如果这个五子棋程序让你来实现,那么你会怎么去做呢?要不我先来说说我的分析吧!

首先,我们需要把五子棋盘映射成一个二维数组,这样当别人每下一个子的时候,便会有一个元素来记录所下的子到底是一颗黑子,还是一颗蓝子了;然后,将二维数组写入磁盘文件,这样我们就可完成存档退出的功能了;接着,从磁盘读取文件,读取文件过后,重新将其恢复成原先的二维数组,当把这个二维数组再次恢复成我们棋盘的形式时,我们也就完成了续上局的功能。

可想而知,如果你没有学过二维数组这种数据结构,那么你怎么可能会写出这样一个五子棋程序呢,必然是写不来的,对吧!

而且,要想能写出性能优秀的五子棋程序,你还得考虑一个问题,什么问题呢?就是压缩问题。你看啊,在上面我们那个棋盘里,其实我们只放了5个棋子,但是整个棋盘却很大,故这必然会导致所映射成的二维数组里面将记录很多没有意义的数据,即默认值0,也即白白浪费掉了那些存储空间。于是,大家可能就会想了,能不能对二维数组进行压缩啊,就只让它记录有意义的数据?其实这是可以的,因为二维数组里面有一种数组就可以实现压缩和解压的效果,它便是稀疏数组。

有了稀疏数组这种数据结构之后,五子棋程序中的存档退出、续上局的功能就得像下面这样去实现了,即:

  • 存档退出:首先,我们需要把五子棋盘映射成一个二维数组,这样当别人每下一个子的时候,便会有一个元素来记录所下的子到底是一颗黑子,还是一颗蓝子了;然后,将二维数组转成稀疏数组(即压缩);接着再写入磁盘文件,这样我们就完成了存档退出的功能。
  • 续上局:首先,从磁盘读取文件,注意,这时读取出来的可是一个稀疏数组哟;然后,将读取出来的稀疏数组转成原先的二维数组(即解压),当把这个二维数组再次恢复成我们棋盘的形式时,我们也就完成了续上局的功能。

大家试想一下,如果你没有学过稀疏数组这种数据结构,那么你怎么可能会写出这样一个五子棋程序呢,必然是写不来的,对吧!就算能写,你最多也就只能做到将五子棋盘映射成一个二维数组然后再写入磁盘文件这一步了,但你要是学过稀疏数组,那情况可就大不同了,你是可以对程序进行优化的,说得直白点,就是可以使用较少的数据来保存棋盘。

嘻嘻😁,数组这种数据结构的重要性是不是就这样被凸显出来了啊!

第三个问题:约瑟夫(Josephu)问题(丢手帕问题)

接下来,我们再来看一个非常经典的案例,即约瑟夫问题,当然,它也被叫作丢手帕问题。

我依稀还记得,当年我大学刚毕业找工作时还做过这样一个面试题,回头一看,那已经是2014年6月份的事情了,那时候我大学刚毕业,还很年轻,而今离毕业都快9年了,真是岁月如梭啊,都说时间是把杀猪刀,可我怎么依旧还是这么的帅气呢,哈哈哈😂,有点恬不知耻了,主要是我还没秃头啊!

思绪还是回到我大学刚毕业找工作那会啊,我记得当时遇到的那道面试题,即约瑟夫问题,是被要求要在Unix环境下用C语言写代码来解决的,而且,我还记得我有用到环形链表,因为那个时候人们都知道约瑟夫问题得用环形链表来解决。

下面,我就来给大家简单讲讲这个约瑟夫问题吧!

约瑟夫问题很简单,它是这样描述的:设编号为1,2,···,n的n个人围坐一圈,约定编号为k(1<=k<=n)的人从1开始报数,数到m的那个人出列,他的下一位又从1开始报数,数到m的那个人又出列,依次类推,直到所有人出列为止,此时便能由此产生一个出队编号的序列了,请问这个出队编号的序列是什么?

在这里插入图片描述

经过我上面的介绍,现在大家该知道非常之经典的约瑟夫问题到底是一个什么问题了吧!知道之后,接下来我们就要分析约瑟夫问题该怎么去解决了。

这里,我就给大家直说吧!我们可以用一个不带头结点的循环链表来处理约瑟夫问题,即:先构成一个有n个结点的单循环链表(单循环链表也叫单向环形链表),然后由k结点起从1开始计数,计到m时,对应结点从链表中删除,接着再从被删除结点的下一个结点又从1开始计数,直到最后一个结点从链表中删除,算法即结束。

注意,单向环形链表是我们后面要讲的一个重点,所以大家到时候可一定要认真学哟,不然的话,你怎么使用它来解决约瑟夫问题啊,你还想不想知道最终的出队编号序列了!

总之,如果你有学过单向环形链表这种数据结构,那么恭喜你,你就能使用这种数据结构来解决约瑟夫问题了,要知道使用单向环形链表这种数据结构来解决约瑟夫问题可是非常形象的哟;如果你没有学过这种数据结构,那么很可惜,你就只能退而求其次使用数组来解决了,说实话,这样做还是有些困难的。

其他常见算法问题

。。。

相关内容

热门资讯

父亲的平凡一生   □盘和林  2025年4月26日上午,老父亲入土为安,按照他生前遗愿,葬于我奶奶坟墓旁边。享年7...
冀菜:冀味新潮 转自:河北日报大河之北·河北非遗文化解读 美食篇冀菜:冀味新潮 5月3日,游客在保定宴饮食博物...
是秀场更是生意场 文博会“交易...   羊城晚报记者 李艺戈 林园  “今年我们还要来。”第二十一届中国(深圳)国际文化产业博览交易会(...
“5·19中国旅游日”倒计时东... 转自:中国旅游报 本报讯(记者 魏彪)5月14日,在2025年“5·19中国旅游日”倒计时城市山东省...
我省抽查化肥等产品440批发现... 本报讯 记者朱柏玲报道 日前,辽宁省市场监督管理局对2025年农用薄膜等产品质量监督抽查情况进行通报...
菲律宾中期选举初步结果出炉杜特... 新华社马尼拉5月14日电 菲律宾媒体14日公布的中期选举初步统计结果显示,菲总统马科斯所在阵营参议院...
恒瑞医药拟全球发售2.245亿...   恒瑞医药(01276)于2025年5月15日-5月20日招股,拟全球发售2.245亿股H股,其中...
@来深建设者,深圳福彩“常回家...   记者从深圳市福彩中心获悉,深圳“爱心福彩·常回家看看”第八届公益活动于5月13日开放报名通道,有...
多地更新数字人民币发展计划,涉... 2025年以来,已有北京、广州、上海等多地发布数字人民币试点工作发展计划,不断创新扩大应用场景,推动...
总能找到改变的“钥匙”    2025年3月,江苏省苏州市吴江区检察院举办检察开放日活动,李冬梅为参加活动的女孩讲授自护知识...
汽车展会火热 提振消费效应显现 转自:经济参考报今年以来,在中央和地方促汽车消费政策的推动下,国内汽车市场呈现出持续向好态势。尤其是...
全国首趟“一单制”跨境铁海联运... 来源:央视新闻客户端 昨天下午,一列满载韩国货品的跨境班列从山东烟台港发车,前往吉尔吉斯斯坦,这是全...
警方提醒:当心骗子陷阱! “你好,是××吗?我是支付宝/微信工作人员,因你的‘百万医疗保险’免费期已结束,现在需立即关闭,否则...
用匠心打造“好房子” 转自:河北日报用匠心打造“好房子”——走进石家庄市长安区回迁改造项目汀香郡 当前,房地产行业...
美国政府遭多方批评 美国副国务卿克里斯托弗·兰多12日在首都华盛顿附近杜勒斯国际机场迎接59名南非白人“难民”到来。美国...
巴菲特谈卸任CEO:“当市场恐...   即将于今年年底卸任的伯克希尔哈撒韦公司CEO沃伦·巴菲特在周三发表的一次采访中表示:“如果市场出...
爱德华多·阿拉纳宣誓就任秘鲁新... 当地时间5月14日,爱德华多·阿拉纳宣誓就任秘鲁新任部长会议主席(总理)。秘鲁部长会议主席(总理)古...
这里是西藏 | 墨脱公路攻坚 转自:CGTN 【这里是西藏 | 墨脱公路攻坚】“逢山开...
老人街头晕倒 民警紧急救助伸援... 本报讯 记者白琳报道 近日,辽阳市公安局宏伟分局兰家派出所的报警电话里传来急切的声音。值班民警闻讯即...
墨西哥中部发生交通事故 已致1... 转自:央视据墨西哥中部普埃布拉州内政部门官员报告,当地时间5月14日上午,该州夸克诺帕兰-瓦哈卡公路...