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

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

如下所示,有这样一段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,也即白白浪费掉了那些存储空间。于是,大家可能就会想了,能不能对二维数组进行压缩啊,就只让它记录有意义的数据?其实这是可以的,因为二维数组里面有一种数组就可以实现压缩和解压的效果,它便是稀疏数组。

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

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

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

嘻嘻

数据结构与算法(Java版) | 就让我们来看看几个实际编程中遇到的问题吧!相关推荐

  1. 全网最全原理讲解!数据结构与算法java版第五版叶核亚答案

    开头 对于一个Java程序员而言,能否熟练掌握并发编程是判断他优秀与否的重要标准之一.因为并发编程是Java语言中最为晦涩的知识点,它涉及操作系统.内存.CPU.编程语言等多方面的基础能力,更为考验一 ...

  2. 数据结构与算法Java版学习教程,最适合新手入门(通俗易懂)

  3. 02优先队列和索引优先队列-优先队列-数据结构和算法(Java)

    文章目录 1 概述 1.1 需求 1.2 优先队列特点 1.3 优先队列分类 1.4 应用场景 1.5 相关延伸 2 说明 3 索引优先队列 3.1 实现思路 3.2 API设计 3.2 代码实现及简 ...

  4. 二叉查找树(1)-二叉树-数据结构和算法(Java)

    文章目录 1 前言 1.1 二叉查找树定义 1.2 二叉查找树的性质 2 基本实现 2.1 API 2.2 实现代码 2.2.1 数据表示 2.2.2 查找 2.2.3 插入 3 分析 4 有序性相关 ...

  5. mooc数据结构与算法python版期末测验_中国大学数据结构与算法Python版答案_MOOC慕课章节期末答案...

    中国大学数据结构与算法Python版答案_MOOC慕课章节期末答案 更多相关问题 java.lang 包的 Character 类的 isJavaIdentifierStart 方法的功能是用来判断某 ...

  6. 0302Prim算法-最小生成树-图-数据结构和算法(Java)

    文章目录 1 Prim算法 1.1 概述 1.1.1 算法描述 1.1.2 数据结构 1.1.3 横切边集合维护 1.2 延时实现 1.2.1 实现代码 1.2.2 性能分析 1.3 即时实现 1.3 ...

  7. 数据结构与算法Java(二)——字符串、矩阵压缩、递归、动态规划

    不定期补充.修正.更新:欢迎大家讨论和指正 本文以数据结构(C语言版)第三版 李云清 杨庆红编著为主要参考资料,用Java来实现 数据结构与算法Java(一)--线性表 数据结构与算法Java(二)- ...

  8. 数据结构和算法(Java)-张晨光-专题视频课程

    数据结构和算法(Java)-579人已学习 课程介绍         如果说各种编程语言是程序员的招式,那么数据结构和算法就相当于程序员的内功. 想写出精炼.优秀的代码,不通过不断的锤炼,是很难做到的 ...

  9. mooc数据结构与算法python版期末考试_数据结构与算法Python版-中国大学mooc-试题题目及答案...

    数据结构与算法Python版-中国大学mooc-试题题目及答案 更多相关问题 婴儿出生一两天后就有笑的反应,这种笑的反应属于(). [判断题]填制原始凭证,汉字大写金额数字一律用正楷或草书书写,汉字大 ...

  10. python数据结构算法 北京大学_北京大学公开课《数据结构与算法Python版》

    之前我分享过一个数据结构与算法的课程,很多小伙伴私信我问有没有Python版. 看了一些公开课后,今天特向大家推荐北京大学的这门课程:<数据结构与算法Python版>. 课程概述 很多同学 ...

最新文章

  1. 几个关于噪声测量的实验
  2. ASP.NET 2.0 - 选用DataSet或DataReader
  3. centos mate桌面_CENTOS7安装各种桌面系统 CENTOS安装桌面图形化GUI GNOME/KDE/Cinnamon/MATE/Xfce...
  4. shell实战之日志脱敏
  5. 华为Mate8 NFC 时好时坏,怎么解决呢?
  6. android 视频地址解析,Android使用webview解析视频并播放
  7. SAP B1打印报表实现本页合计和本单合计的方法
  8. ROS与PCL:在setconditionfunciton时,无法使用std::bind
  9. astah新建一个项目_Astah SysML
  10. C语言经典回文数三种求法
  11. CKEditor5系列二:创建简单插件
  12. LeetCode 对角线遍历(找规律)
  13. 研究了下FBX Sdk小记录
  14. 学习笔记 | SMART原则:制定目标
  15. 互联网快讯:华虹虹芯基金正式发起成立;极米高性能投影产品获用户青睐;中国电信联手钉钉研发“天翼钉”
  16. 解决在vue中切换图片,gif格式的图片停在最后一帧的问题
  17. 什么是堡垒机?堡垒机的作用?
  18. 最短路构造最短路95 C. Volleyball
  19. scratch做出按键控制屏幕滚动效果
  20. 计算机网络实验-eNSP路由器配置

热门文章

  1. Mind quantum 基础知识学习笔记(1)
  2. mysql建表时错误1075_navicat出现错误1075怎么办
  3. 比较99^100与100^99大小
  4. java套打实现_java 套打 实现
  5. 有编程基础的人学python_有哪些适合零编程基础的人学习Python的书?
  6. 员工和老板的差距不只是能力,还有战略思维
  7. 更换计算机电源标准化作业,【武电微课堂】CTC检修标准化作业流程
  8. 金蝶K/3系统结账前检查
  9. 复旦计算机学院博士张磊,张磊-计算机与信息工程学院官网
  10. SCTP 的安装与编程