真题训练1-算法思维训练

文章目录

  • 真题训练1-算法思维训练
    • 前言
    • 项目环境
    • 例题1:斐波那契数列
    • 例题2:判断一个数组中是否存在某个数
    • 参考

前言

第十四章 《通用解题的方法论》 我们讨论了解题的方法论,宏观上可以分为以下 4 个步骤:

  1. 复杂度分析,估算问题中的复杂度的上限和下限。
  2. 定位问题,根据问题类型,确定采用何种算法思维。
  3. 数据操作分析,根据增、删、查和数据顺序关系选择合适的数据结构,利用空间换时间的思想。
  4. 编码实现。

本章,我们用一些算法的面试题进行练习,来训练算法思维。

项目环境

  • jdk 1.8
  • github 地址:https://github.com/huajiexiewenfeng/data-structure-algorithm
    • 本章模块:chapter10

例题1:斐波那契数列

斐波那契数列是:0,1,1,2,3,5,8,13,21,34,55,89,144……。你会发现,这个数列中元素的性质是,某个数等于它前面两个数的和;也就是 a[n+2] = a[n+1] + a[n]。至于起始两个元素,则分别为 0 和 1。在这个数列中的数字,就被称为斐波那契数。

【题目】:

写一个函数,输入 x,输出斐波那契数列中第 x 位的元素。例如,输入 4,输出 2;输入 9,输出 21。要求:需要用递归的方式来实现。

【解题】:

  • 复杂度分析

题目中要求要用递归的方式来实现,而递归的次数与 x 的具体数值有非常强的关系。因此,此时的时间复杂度应该是关于输入变量 x 的数值大小的函数。

  • 定位问题

因为题目中已经明确了要采用递归去解决。所以也不用再去做额外的分析和判断了。

  • 数据操作分析

这道题只是简单的数字求和,所以也不需要复杂的数据结构。

  • 编码实现

相关章节 《数据结构与算法|第七章:递归》

递推公式如下:

f(n) = f(n-1)+f(n-2);

终止条件:n<=1

根据递推公式的伪代码如下:

        protected Integer f(int n) {if (n <= 1) {return n;}int a = f(n - 1);int b = f(n - 2);return a + b;}

最后的实现代码:

public class FibonacciDemo {public static void main(String[] args) {int index = 8;System.out.printf("位置[%d]的斐波纳契数为:[%d]", index, fn(index));}public static int fn(int number) {if (number <= 1) {return number;}return fn(number - 1) + fn(number - 2);}
}

例题2:判断一个数组中是否存在某个数

【题目】

给定一个经过任意位数的旋转后的排序数组,判断某个数是否在里面。

例如,对于一个给定数组 {4, 5, 6, 7, 0, 1, 2},它是将一个有序数组的前三位旋转地放在了数组末尾。假设输入的 target 等于 0,则输出答案是 4,即 0 所在的位置下标是 4。如果输入 3,则返回 -1。

【解题】:

  • 复杂度分析

复杂度上限:遍历整个数组,查找的时间复杂度为 O(n)。

复杂度下线:但是它是一个被旋转之后的有序数组,有序数组可以利用二分查找,查找时间复杂度为O(logn)。

  • 定位问题

关键词:有序数组,旋转,查找

首先这是一个在数组中查找元素的问题,其次这个数组是有序数组,所以可以通过二分查找来解决。

  • 数据操作分析

现在的问题是虽然数组有序,但是经过了旋转,如果我们通过二分查找先查找前面未旋转数组的元素,也就是 0 到 n-3 位置的元素,比如{4, 5, 6, 7},如果找不到,我们查找后面的有序数组{0,1,2}。

需要注意的是题目中说的是任意位数的旋转后的排序数组,说明这个旋转位数并不确定,这又增加了一定的复杂性。

所以我们需要在递归的过程中判断,分裂点的左边和右边的数组是否有序,如果有序则采用二分查找,如果无序,继续递归,因为无序的情况和题目的情况是一样的,相当于一个子问题,所以可以递归。

  • 编码实现

二分查找可以参考之前的文章 《数据结构与算法|第十一章:二分查找-上》

本例中直接把代码拷贝过来,做简单的修改。

public class FindNumberDemo {public static void main(String[] args) {int[] numbers = new int[]{4, 5, 6, 7, 8, 0, 1, 2};int number = 2;int index = findNumber(numbers, number, 0, numbers.length - 1);System.out.printf("数组中数字[%d]的位置是[%d]\n", number, index);}private static int findNumber(int[] numbers, int number, int begin, int end) {int mid = begin + ((end - begin) >> 1);// 分裂点if (number == numbers[mid]) {return mid;}if (numbers[begin] < numbers[mid - 1]) {// 有序// 如果目标在数组范围内if (number <= numbers[mid - 1] && number >= (numbers[begin])) {return binarySearch(numbers, number, begin, mid - 1);// 二分查找} else {return findNumber(numbers, number, mid + 1, end);// 继续递归无序的数组}} else {// 如果 begin 到 mid -1 无序,说明 mid+1 到 end 有序// 如果目标在数组范围内if (number <= numbers[end] && number >= (numbers[mid + 1])) {return binarySearch(numbers, number, mid + 1, end);// 二分查找} else {return findNumber(numbers, number, begin, mid - 1);// 继续递归无序的数组}}}private static int binarySearch(int[] numbers, int value, int low, int high) {int index = -1;while (low <= high) {int mid = low + ((high - low) >> 1);if (numbers[mid] == value) {return mid;} else if (numbers[mid] < value) {low = mid + 1;} else if (numbers[mid] > value) {high = mid - 1;}}return index;}
}

参考

  • 《重学数据结构与算法》- 公瑾

真题训练1-算法思维训练相关推荐

  1. 致广大关注《网络规划设计师考试案例梳理、真题透解与强化训练》读者朋友的一封信...

    致广大关注<网络规划设计师考试案例梳理.真题透解与强化训练>读者朋友的一封信 书是人类进步的阶梯,读书是增强个人软实力的佳径. 好读书是你的美德,读好书是你的选择,书好读是我们的承诺! 如 ...

  2. 2011年给力新作——《数据库系统工程师考试案例梳理、真题透解与强化训练》...

    2011年给力新作--<数据库系统工程师考试案例梳理.真题透解与强化训练> 本书是为有志于通过全国计算机专业技术资格考试(数据库系统工程师)的读者编写的一本针对性强.高效的案例辅导用书,并 ...

  3. 《网络管理员考试案例梳理、真题透解与强化训练》复习重点

    <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />   <网 ...

  4. 网络管理员考试案例梳理、真题透解与强化训练

    <网络管理员考试案例梳理.真题透解与强化训练>已下厂印刷,即将上市<?xml:namespace prefix = o ns = "urn:schemas-microsof ...

  5. php编程数学思维题,一年级数学:思维训练题(13套),打印每周一练,益智提升专用...

    一年级数学:思维训练题(13套),打印每周一练,益智提升专用! 众所周知,思维对于数学的学习是最为关键的,尤其是在小学阶段,需要趁早的培养孩子的逻辑思维能力.思维不是凭空想象,而是要依据手里的题目,能 ...

  6. php编程数学思维题,小学一年级数学思维训练100题打印版.doc

    小学一年级数学思维训练100题53297 PAGE PAGE 1 小学一年级思维训练100题 1.哥哥4个HYPERLINK "/click/click.php?r=/article_htm ...

  7. 逻辑思维训练和推理思维训练

    逻辑思维训练 逻辑思维训练500题(带答案) 75道经典逻辑思维题及答案 推理思维测试 除照片外拍摄者额外提供的信息如下: 1,天空中的飞机是从伦敦飞往香港的波音747 2,该照片摄于2019年10月 ...

  8. 【蓝桥杯选拔赛真题51】Scratch赛车训练 少儿编程scratch图形化编程 蓝桥杯选拔赛真题讲解

    目录 scratch赛车训练 一.题目要求 编程实现 二.案例分析 1.角色分析

  9. 西电算法分析与设计核心考点汇总(期末真题,教材算法导论)

    文章目录 前言 一.历年考题 1.1 判断题 1.2 单选题 1.3 复杂度计算 1.4 分治 1.5 算法设计(01背包,最短路径) 1.6 最大子数组问题 1.7 算法设计(最长回文串) 二.核心 ...

最新文章

  1. OSPF-网络类型(ip ospf network ?)
  2. poj2586(贪心盈亏问题)
  3. 模型独立学习:多任务学习与迁移学习
  4. node sqlite 插入数据_使用 Sequelize 操作 Sqlite3 数据库
  5. boost::gil::compute_harris_responses用法的测试程序
  6. FPGA实现智能小车竞速
  7. 从源码角度分析Android系统的异常捕获机制是如何运行的
  8. Scala-Unit6-final/type关键字、样例类样例对象
  9. iPhone 诈骗又出新招,别看见弹窗就输密码
  10. 小公司如何选择合适的信息管理软件
  11. python在城市规划中的运用_温州市城市规划展示厅
  12. mysql数据库命令大全菜鸟_mysql常用命令
  13. HTTP URL长度限制
  14. 根服务器修改密钥,更改 SQL Server 实例的服务主密钥
  15. Java 点餐小程序源码带管理后台(免费分享)
  16. 超详细的CMD文件讲解(DSP28035)
  17. python3 import的一个细节
  18. Java继承的特征和优势
  19. xxl-job定时任务
  20. html 图片加载 占位,css实现图片未加载完成时占位显示

热门文章

  1. 微信小程序注册与登录
  2. C/C++中的STL库
  3. 学习 Python 之 Pandas库
  4. 基于Neo4j中医方剂药材知识图谱大数据可视化分析系统的设计与开发
  5. 卷积自编码器CAEs
  6. 模拟实现msn登陆过程(MSNP15)
  7. UML教程1:模型图的构成和功能说明
  8. 放假期间网站被挂马的解决办法
  9. visifire笔记
  10. 分类模型的可信度评估