剑指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 ...
随机推荐
- nginx http强制跳转https
通过nginx的rewrite 进行301永久重定向,参考如下配置即可. server { listen 192.168.1.111:80; server_name test.com; rewrit ...
- KVM虚拟化学习记录
请查看我的有道云笔记: http://note.youdao.com/noteshare?id=ed7308eeb1ee675b406494f4ba042ba4&sub=047FD8C61BA ...
- CRM和ERP的Sales Organization的映射关系
在如下的配置里可以维护CRM和ERP的Sales Organization的映射关系. 例如,ERP的编号为0001的销售组织映射到CRM的编号为O 50040102的销售组织: 这种映射关系存储在表 ...
- IOS 通讯录 (访问,添加,修改)
如何访问用户的通讯录 在iOS中,有2个框架可以访问用户的通讯录 AddressBookUI.framework 提供了联系人列表界面.联系人详情界面.添加联系人界面等 一般用于选择联系人 Add ...
- C++中的RAII(转)
转自https://blog.csdn.net/wangshubo1989/article/details/52133213 有很多东西我们一直在用,但是不知道他的名字. 什么是RAII? RAII是 ...
- 【[SCOI2015]情报传递】
非常无脑的板子题,就当是练一下板子 我们可以先将所有的操作离线下来,之后那些搜集过情报的点就有了点权,对于查询操作,就是查询一下这条路径上有几个点点权满足\(st<=now-C+1\) #inc ...
- msfconsole_无法启动问题
service postgresql start # 启动数据库服务 msfdb init # 初始化数据库 msfconsole # 启动metasploit
- 【洛谷P2168】[NOI2015]荷马史诗
荷马史诗 建一个k叉哈夫曼树,用堆维护一下 // luogu-judger-enable-o2 #include<iostream> #include<cstdio> #inc ...
- 通过ajax给后台提交数据时,radio性别数据的获取
通过ajax向后台异步发送数据,经常我们会遇到个人信息额提交,一般我们采用FormData来装数据.在装性别值得时候,我们会有两个radio框,获取radio值得方法如下: 一般情况下,一个radio ...
- html基础用法(上)
html的定义: html超文本标记语言,标准通用标记语言下的一个应用. “超文本”就是指页面内可以包含图片,链接,甚至音乐,程序等非文字语言. 超文本标记语言的结构包括“头”部分(head),和“主 ...