剑指offer题目系列一
本篇介绍《剑指offer》第二版中的四个题目:找出数组中重复的数字、二维数组中的查找、替换字符串中的空格、计算斐波那契数列第n项。
这些题目并非严格按照书中的顺序展示的,而是按自己学习的顺序,每个题目包含了分析和代码,代码都是用Java语言编写的。
1、找出数组中重复的数字
题目:
在一个长度为n的数组里,所有数字都在0~n-1的范围内。数组中某些数字是重复的,但不知道有几个数字重复,也不知道每个数字重复了几次,请找出数组中任意一个重复的数字。例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是重复的数字2或者3。
解答:
这里提供两种方式。
第一种方式:本题所有数字都在0~n-1的范围内,如果数组中没有重复的数字,那么数组排序之后数字i与其下标i的值是一一对应的,即0-0、1-1、2-2……由于有重复数字,则排序后有些位置可能有多个数字,有些位置可能没有数字。
这种方式的思路就是将数字i放到其下标i处,如果存在两个下标对应的数字相等,则说明有重复,该数字就是一个重复的数字。
代码:

代码中尽管有两重循环,但每个数字最多只要交换两次就能找到它自己的位置,因此总的时间复杂度为O(n),同时空间复杂度为O(1),因此推荐此方法。
第二种方式:用HashMap或ArrayList,都是先从第一个元素开始遍历数组,如果HashMap或ArrayList中不存在该元素,则将其放入,如果存在,则说明有重复。这种方式需要额外的空间,时间复杂度和空间复杂度都为O(n)。
代码:

这里仅仅以HashMap为例,ArrayList与其类似,不再赘述。
2、二维数组中的查找
题目:
在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
解答:
这里提供4种类似的方式:可以先从二维数组右上角(第一行最后一列)的数字开始比较,如果它比要查找的数字小,则第一行所有数字都比它小,说明该数字不在第一行。然后比较第二行最后一列数字,如果比要查找的数字大,则说明在第二行,然后将第二行的数组按倒序的顺序逐个与其比较,直到找到为止。这种方式是从第一行往下逐行排除,找到目标数字所在的行以后,按倒序逐列排除。另外三种方式分别是从最后一行往上逐行排除,找到目标数字所在的行以后,按正序逐列排除;从最后一列往左逐列排除,找到目标数字所在的列以后,按正序逐行排除;从第一列往右逐列排除,找到目标数字所在的列以后,按倒序逐行排除。
下面代码仅说明其中的两种按行排除的方式。
代码:


3、替换字符串中的空格
题目:
请实现一个函数,把字符串中的每个空格替换成“%20”。例如,输入“We are happy.”,则输出“We%20are%20happy.”。
解答:
这里提供2种方式。
第一种方式:先统计出原字符串中空格个数,并计算出替换之后字符串的长度,然后新建一个数组,使其长度等于替换之后字符串的长度,用于存放替换之后字符串。
如果从前往后遍历字符串,碰到空格就替换,那么后面的字符可能会多次移动,总的时间复杂度为O(n²),效率不高。因此这里从后往前遍历原字符串,如果是非空格字符,就直接复制到新数组中(注意新数组也是从后往前放入字符);如果是空格,则按0、2、%的顺序放入新数组……直到遍历完字符串为止,这样就能保证每个元素只会移动一次,时间复杂度为O(n)。
代码:

第二种方式:因为Java语言中String类型字符串是无法改变的,而StringBuilder和StringBuffer类型字符串是可以改变的,因此可以用这两个类型,通过append()方法拼接字符串。如果对线程安全有要求,则可以用StringBuffer,没要求可以用StringBuilder。以下以StringBuilder为例,StringBuffer与其类似。

4、计算斐波那契数列第n项
题目:
求斐波那契数列的第n项。写一个函数,输入n,求斐波那契数列的第n项。
斐波那契数列定义如下:第1项F(1)=1,第2项F(2)=1,从第3项开始,每一项都等于前两项之和。前几项数字为:1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377……
解答:
这里提供两种方式:非递归方式和递归方式。
第一种方式,非递归方式(优先选择)。定义三个变量,分别存放前两项和第三项(当前项)的值,逐个计算斐波那契数列的每一项,直到第n项停止并返回。只有一个循环,时间复杂度为O(n)。
代码:

第二种方式,递归方式。递归方式的代码很简洁,但仔细分析就会发现,递归方式计算的过程中会产生大量重复计算。比如想求f(10),得先计算出f(9)和f(8);同样想求出f(9),得先计算出f(8)和f(7);想求出f(8),得先计算出f(7)和f(6)……可以看到f(8)、f(7)等项都求了两次值。当n很大时,重复计算量会非常大,效率会很低,因此这种方式当n很小时还可以,很大时就不太适用了。所以优先推荐第一种方式。
代码:

转载请注明出处 http://www.cnblogs.com/Y-oung/p/8858960.html
工作、学习、交流或有任何疑问,请联系邮箱:yy1340128046@163.com 微信:yy1340128046
剑指offer题目系列一的更多相关文章
- 剑指offer题目系列三(链表相关题目)
本篇延续上一篇剑指offer题目系列二,介绍<剑指offer>第二版中的四个题目:O(1)时间内删除链表结点.链表中倒数第k个结点.反转链表.合并两个排序的链表.同样,这些题目并非严格按照 ...
- 剑指offer题目系列二
本篇延续上一篇,介绍<剑指offer>第二版中的四个题目:从尾到头打印链表.用两个栈实现队列.旋转数组的最小数字.二进制中1的个数. 5.从尾到头打印链表 题目:输入一个链表的头结点,从尾 ...
- 代码题 — 剑指offer题目、总结
剑指offer题目总结: https://www.cnblogs.com/dingxiaoqiang/category/1117681.html 版权归作者所有,任何形式转载请联系作者.作者:马孔多 ...
- 再来五道剑指offer题目
再来五道剑指offer题目 6.旋转数组的最小数字 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素. 例如数组{3,4, ...
- 剑指 Offer 题目汇总索引
剑指 Offer 总目录:(共50道大题) 1. 赋值运算符函数(或应说复制拷贝函数问题) 2. 实现 Singleton 模式 (C#) 3.二维数组中的查找 4.替换空格 ...
- 牛客网上的剑指offer题目
题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 题目:请实现一个函数,将一 ...
- 剑指offer题目java实现
Problem2:实现Singleton模式 题目描述:设计一个类,我们只能生成该类的一个实例 package Problem2; public class SingletonClass { /* * ...
- 【剑指Offer】剑指offer题目汇总
本文为<剑指Offer>刷题笔记的总结篇,花了两个多月的时间,将牛客网上<剑指Offer>的66道题刷了一遍,以博客的形式整理了一遍,这66道题属于相对基础的算法题目,对于 ...
- 剑指offer自学系列(三)
题目描述: 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变,例如{5,1,4,2 ...
随机推荐
- Python 列表排序方法reverse、sort、sorted操作方法
python语言中的列表排序方法有三个:reverse反转/倒序排序.sort正序排序.sorted可以获取排序后的列表.在更高级列表排序中,后两中方法还可以加入条件参数进行排序. reverse() ...
- 再学UML-UML用例建模解析(一)
UML(统一建模语言)是当前软件开发中使用最为广泛的建模技术之一,通过使用UML可以构造软件系统的需求模型(用例模型).静态模型.动态模型和架构模型.UML通过图形和文字符号来描述一个系统,它是绘制软 ...
- 查看锁定的session信息脚本
查看当前被阻塞的对象和锁信息SELECT DISTINCT s1.inst_id BlockingInst, s1.sid BlockingSid, s1.seri ...
- echart 折线图、柱状图、饼图、环形图颜色修改
之前在做报表的时候用过echart 用完也就完了,而这次在用的时候已经忘了,所以这里简单记录一下,好记性不如烂笔头!!! 1.折线图修改颜色: xAxis: { type: 'category', b ...
- 小草的Trouble学生信息管理系统
小草最近上课学C++,在图书馆纠结了好久,决定做这个小东西,没想到遇到了好多困难,好吧,功夫不负有心人,小草也在敲代码中提高了不少. 小草硬是学了好几天,才搞完这个东西,也算是了结了小草的一个心结. ...
- Codeforces Round #521 (Div. 3) D. Cutting Out 【二分+排序】
任意门:http://codeforces.com/contest/1077/problem/D D. Cutting Out time limit per test 3 seconds memory ...
- HttpHandler使用Session
继承自IHttpHandler的类要实现两个接口:ProcessRequest和IsReusable但还不能使用Session,要使用Session需要下面的步骤处理: 1.先引用System.Web ...
- webapi2返回 已拒绝为此请求授权。
开始用的webapi2中是没有问题的,后来再项目中加了个过滤器并继承了AuthorizeAttribute 然后在全球文件中注册你的过滤器,让每次执行的时候都会进来 我项目中只重写了OnAuthori ...
- 协议类接口 - I2C
一.12c总线概述 I2C( Inter-Integrated Circuit,又称IIC)总线是一种串行总线,用 于连接微控制器及其外围设备,硬件图非常简单:一条串行数据线(SDA),一条串行时钟线 ...
- 02-第一个iOS程序-开发步骤
打开Xcode 选择项目模板 Single View Application是最适合初学者的模板 设置项目属性 运行程序 不管怎样,先运行第一个iOS程序看看效果先(用快捷键Command + R 也 ...