算法
文章平均质量分 57
策码奔腾的小单
来自某BAT互联网大厂的一枚程序员,注重总结、分享和自我成长,长期不间断的投资自己,未来可期。
展开
-
《剑指offer》——正则表达式匹配
T: 题目描述: 请实现一个函数用来匹配包括’.’和’‘的正则表达式。模式中的字符’.’表示任意一个字符,而’‘表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串”aaa”与模式”a.a”和”ab*ac*a”匹配,但是与”aa.a”和”ab*a”均不匹配前两天刚看了有关正则表达式的基本语法和用法,今天刷牛客,就恰好碰到了这个题。原创 2016-05-20 14:30:25 · 1357 阅读 · 0 评论 -
《剑指offer》——链表中环的入口结点
T: 题目描述 一个链表中包含环,请找出该链表的环的入口结点。 基本做法不考虑其中潜在的规律,就按照一般的方法,创建一个list,把扫描过的节点都存储在list中,知道下一个节点在list中已经存在,那就说明该节点就是入口节点。这种方式下的时间复杂度为O(n2)O(n^2)我的code: /* public class ListNode { int va原创 2015-12-13 20:02:01 · 4362 阅读 · 1 评论 -
《剑指offer》——整数中1出现的次数(从1到n整数中1出现的次数)
T: 题目描述 求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数。 两种解决方式:找规律和暴力遍历暴力遍历化为字符串,或者用10取余,都是一样的道理:c原创 2015-11-19 19:53:48 · 970 阅读 · 0 评论 -
《剑指offer》——删除链表中重复的结点
T: 题目描述 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5 题目不难,细心做就行。code: /* public class ListNode { int val; ListNode next = null;原创 2015-11-25 20:07:35 · 693 阅读 · 0 评论 -
《剑指offer》——扑克牌顺子
T: 题目描述 LL今天心情特别好,因为他去买了一副扑克牌,发现里面居然有2个大王,2个小王(一副牌原本是54张^_^)…他随机从中抽出了5张牌,想测测自己的手气,看看能不能抽到顺子,如果抽到的话,他决定去买体育彩票,嘿嘿!!“红心A,黑桃3,小王,大王,方片5”,“Oh My God!”不是顺子…..LL不高兴了,他想了想,决定大\小 王可以看成任何数字,并且A看作1,J为11,Q为1原创 2015-11-24 19:46:27 · 513 阅读 · 0 评论 -
《剑指offer》——左旋转字符串
T: 题目描述 汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它! 片段截取法这种方法,相对于最笨的方法来说,已经做了改进。改进的地方在于:如果原创 2015-12-10 21:34:42 · 705 阅读 · 0 评论 -
《剑指offer》——把字符串转换成整数
T: 题目描述 将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。 这种题目交代不清楚,也没啥技巧含量和思考价值,既然出现了,就顺带着做一下吧。。code: /** * T: 把字符串转换成整数 * * 题目描述 * 将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。 * * date:原创 2015-12-10 20:53:08 · 884 阅读 · 0 评论 -
《剑指offer》——替换空格
T: 题目描述 请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。constraints: 时间限制:1秒空间限制:32768KMy Solution: public String replaceSpace(StringBuffer str) { Strin原创 2015-11-01 20:59:55 · 397 阅读 · 0 评论 -
《剑指offer》——求1+2+3+……+n
T: 题目描述 求1+2+3+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。 这个题类型以前没有碰到过,刚开始看到题目,也不知道怎么下手,想用递归去做,但是一想到递归必须要有终止条件,即以前写的终止条件都是要用到if语句的,又和题目相违背。。。无奈,看了下别人写的代码,出现了一个 **的短路,&& 或者 ||原创 2015-11-01 21:19:06 · 580 阅读 · 0 评论 -
《剑指offer》——旋转数组的最小数字
T: 题目描述 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个非递减序列的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 题目不完善,没说为空时应该如何返回其最小值,其他的也没什么技术含量。code: public int minNumberInRotateArray(int []原创 2015-11-01 21:14:52 · 542 阅读 · 0 评论 -
《剑指offer》——树的子结构
T: 题目描述 输入两颗二叉树A,B,判断B是不是A的子结构。 这地方需要注意的有两点:判断的是“子结构”,而非“子树”,我第一次提交,就当成子树去做的,结果error;如果两个子树中有一个是null,那么就返回false,这个规定题目中没有给出说明,《剑指offer》中的很多题目都有类似的缺陷。这种题目,递归是最好的方式,我的思路: 略微麻烦了些,因为是将B和A比较,判断B是原创 2015-11-01 21:21:31 · 559 阅读 · 0 评论 -
《剑指offer》——从尾到头打印链表
T: 题目描述 输入一个链表,从尾到头打印链表每个节点的值。 这道题,常规方法去做,没有难度。code: /** * 先遍历一遍,得到链表的长度,然后定义一个等长的int型数组, * 然后在重新从头遍历数组,将数据存入int[]中,然后逆序添加到Arraylist<Integer>中。 * * @param listNode *原创 2015-11-01 21:20:26 · 337 阅读 · 0 评论 -
《剑指offer》——第一个只出现一次的字符位置
T: 题目描述 在一个字符串(1<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符的位置。若为空串,返回-1。位置索引从0开始. 这道题目,和以下问题的解决思路类似:问题: 给定一个字符串,该字符串都是由阿拉伯数字0~9组成,该字符串可能很长(几万,甚至更长),问如何更快的找出所有只出现过一次的数字?解法相同,而设定场景不同,这就是需要融会贯通的地方。比原创 2015-11-17 22:20:20 · 1096 阅读 · 0 评论 -
《剑指offer》——从上往下打印二叉树
T: 题目描述 从上往下打印出二叉树的每个节点,同层节点从左至右打印。 这道题没什么难的,就是一个树的层次遍历,用个队列即可。code: import java.util.ArrayList; import java.util.LinkedList; import java.util.List; import java.util.Queue; /*原创 2015-11-23 21:34:18 · 839 阅读 · 0 评论 -
《剑指offer》——和为S的两个数字
T: 题目描述 输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。 输出描述: 对应每个测试案例,输出两个数,小的先输出。 注意到数组有序,最基本的做法,那就是两层循环,挨个找,但是耗时,时间复杂度为O(n2)O(n^2)。既然数组有序,能不能利用“有序”的特性呢?两者比较,始终以前面的原创 2015-11-26 19:10:41 · 701 阅读 · 0 评论 -
《剑指offer》——孩子们的游戏(圆圈中最后剩下的数)
T: 题目描述 * 每年六一儿童节,NowCoder都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此。HF作为NowCoder的资深元老,自然也准备了一些小游戏。其中,有个游戏是这样的:首先,让小朋友们围成一个大圈。然后,他随机指定一个数m,让编号为0的小朋友开始报数。 每次喊到m的那个小朋友要出列唱首歌,然后可以在礼品箱中任意的挑选礼物,并且不再回到圈中,从他的下一个小朋友开始,原创 2015-12-14 20:51:13 · 1306 阅读 · 0 评论 -
《剑指offer》-- 二叉树的下一个结点
题目描述: 给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。解题思路: /** * 思路: * * 对于一个节点,其后续节点有三种形式: * 1. 该节点的右指针为null,那么就往前找其父节点(设为a), *原创 2016-04-03 09:32:51 · 1447 阅读 · 0 评论 -
《剑指offer》——对称的二叉树
定义法递归法T: 题目描述 请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。 定义法这道题目,竟然没有想出来如何用递归做,虽然也在最开始做了挣扎,还是没找到递归的切入点,只得从定义出发,先按照原二叉树,搞一个新的镜像,然后再搞个函数,对比两个树是否完全相同,貌似很麻烦,其实做起来,确实很麻烦。。。code: cla原创 2015-12-09 22:35:03 · 1708 阅读 · 0 评论 -
《剑指offer》——和为S的连续正数序列
遍历穷举法滑动窗口法T: 题目描述 小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck!原创 2015-12-07 21:56:55 · 2231 阅读 · 1 评论 -
《剑指offer》——重建二叉树
T: 题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。 不解释了,麻烦的连自己都懒得解释了,直接上代码吧,今天也太累了,事情太多,心里乱糟糟的。。code: /** * T:原创 2015-12-06 22:34:03 · 485 阅读 · 0 评论 -
《剑指offer》——调整数组顺序使奇数位于偶数前面
T: 题目描述 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。 这道题目,我思考了好久,想过各种解决方案,都是基于在本数组上进行操作,无额外的数组开销,还要考虑线性复杂度。但是最终还是没找到解决方案,只得用额外开辟数组的方式来解决。我的核心code: /*原创 2015-12-05 19:55:44 · 562 阅读 · 0 评论 -
《剑指offer》——数组中重复的数字
T: 题目描述 在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是重复的数字2或者3。太初级的题目,不解释了。。。我的code:/** * T: 数组中重复的数字 * * 题目描述原创 2015-12-04 21:46:13 · 1045 阅读 · 0 评论 -
《剑指offer》——按之字形顺序打印二叉树
T: 题目描述 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。 这道题目与前几天做的一道题目《把二叉树打印成多行》类似,只不过拿到题目里,把每一层的节点都保存在一个单独数组当中,这道题目中,需要按照“之”字形保存,很简单,用个flag标记一下就能做到。我的code: import j原创 2015-12-04 14:42:52 · 609 阅读 · 0 评论 -
《剑指offer》——二叉树的镜像
T: 题目描述 操作给定的二叉树,将其变换为源二叉树的镜像。 题目考察的是在二叉树中递归的使用。这种递归也是最简单的递归,初级的不能再初了。。。code: /** public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null;原创 2015-12-02 21:55:42 · 833 阅读 · 0 评论 -
《剑指offer》——二叉搜索树与双向链表
T: 题目描述 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。 这道题目,解决思路不难,类似于先序遍历,只不过要在压栈和出栈的过程中,把树的结构变为一个双向链表。一张图解释用栈的解题思路:详细说明都在代码注释当中.code: /** public class TreeNode { int原创 2015-12-03 21:24:37 · 464 阅读 · 0 评论 -
《剑指offer》——把二叉树打印成多行
T: 题目描述 从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。 解法都在代码注释当中了。我的code: import java.util.ArrayList; import java.util.LinkedList; import java.util.Queue; /* public class TreeNode {原创 2015-12-01 16:50:49 · 1062 阅读 · 0 评论 -
《剑指offer》——二叉树中和为某一值的路径
T: 题目描述 输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。 这道题从昨天晚上就在抠,抠了两个小时,最终代码写出来了,感觉有bug,没敢提交。前一个小时,自己独立思考,寻找解题思路,也知道用递归,可如果使用递归?递归函数的定义该怎么设置?还是没思路。。。后来在网上看到有博客中给出了相关的二叉原创 2015-11-30 10:50:32 · 1409 阅读 · 0 评论 -
《剑指offer》——二叉搜索树的后序遍历序列
T: 题目描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。 考察二叉搜索树的后序遍历特征,具体的特征说明,以及结题思路,已在代码的注释当中详细解释。code: /** * T: 二叉搜索树的后序遍历序列 * * 题目描述 * 输入一个整数数组原创 2015-11-28 11:32:22 · 751 阅读 · 0 评论 -
《剑指offer》——数组中出现次数超过一半的数字
T: 题目描述 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。 如果用暴力搜索,那就太没意思了,所有的问题都可以用枚举法解决。我的解法: 把当前array数组的第0号元素,即array[0],与后面的作比较,如果相等,计数原创 2015-11-27 17:14:15 · 910 阅读 · 0 评论 -
《剑指offer》——字符流中第一个不重复的字符
T: 题目描述 请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符”go”时,第一个只出现一次的字符是”g”。当从该字符流中读出前六个字符“google”时,第一个只出现一次的字符是”l”。 输出描述: 如果当前字符流没有存在出现一次的字符,返回#字符。这道题目不知所云,做的也是稀里糊涂。。。。ORZ……code: impor原创 2015-12-08 21:14:41 · 841 阅读 · 0 评论 -
《剑指offer》——数组中只出现一次的数字
hashMap利用只出现一次的关系T: 题目描述 一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。 题目类似于前两天做的一道题目:”第一个只出现一次的字符位置”。但不同的是这次找出数组中,只出现一次的数字,仅仅是元素类别不同,结题方式就完全不同了。hashMap首先想到的是用hashMap去做,但是这种做法,并不算高效,解法没有第二种方法巧原创 2015-11-22 20:24:29 · 749 阅读 · 0 评论 -
《剑指offer》——顺时针打印矩阵
T: 题目描述 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字, 例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字 1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10. constraints: 时间限制:1秒空间限制:32768K 顺时针循环,原创 2015-11-01 21:11:38 · 686 阅读 · 0 评论 -
《剑指offer》——变态跳台阶
这是《跳台阶》题目的升级版,不止是每步都是1或者2,而是可以从1调到n,求其跳法。T: 题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。 constraints: 时间限制:1秒空间限制:32768K这一题目,虽然只是略微的修改了条件,但其解题方式完全不同。 同时,“青蛙跳台阶”只是一种具体的场景设定,抽象来原创 2015-11-01 21:09:38 · 486 阅读 · 0 评论 -
《剑指offer》——二维数组中的查找
T: 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。Constraints: 时间限制:1秒空间限制:32768KMy Solution: 由于各行和各列都遵循一次增大的规则,给定一个数target,首先在这样一个二维数组中找到其右边界rightSide和下边界do原创 2015-11-01 20:56:53 · 614 阅读 · 0 评论 -
《剑指offer》——用两个栈实现队列
T: 题目描述 用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。 栈的特性是先进后出,队列的是先进先出,知道这点,基本上都能想到怎么做了。。。 还是说一下步骤: 队列的push()操作,就直接在stack1上进行栈的push()操作即可; 队列的pop()操作,其实就是得到stack1中最底下的那个元素,怎么得到呢?先把上面逐个退出的原创 2015-11-06 19:46:08 · 3413 阅读 · 1 评论 -
《剑指offer》——构建乘积数组
T: 题目描述 给定一个数组A[0,1,…,n-1],请构建一个数组B[0,1,…,n-1],其中B中的元素B[i]=A[0]A[1]…A[i-1]*A[i+1]…*A[n-1]。不能使用除法。 刚看到这一题目,直接想到的结题思路就是计算一个总乘积MM,然后对于每个ii,都有:B[i]=M/A[i]B[i] = M/A[i]这是最笨的一种方式,也是最容易实现的一种方式,但是看到题目描述原创 2015-11-07 20:46:52 · 420 阅读 · 0 评论 -
《剑指offer》——矩形覆盖
T: 题目描述 我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法? 这个题目乍看不知道怎么入手,如果稍加分析的话,会发现其实很简单。分析如下图: 可得到递推公式:d(n) = d(n-1) + d(n-2)code: package niuke.sward2offer.matrixCover; /原创 2015-11-06 20:23:29 · 836 阅读 · 0 评论 -
《剑指offer》——合并两个排序的链表
T: 题目描述 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。 两个有序链表的合并问题,考察的是对链表的操作。对于此类题目,一般有两种解决思路:如果不考虑内存消耗问题,那就重新定义一个新的链表。在原有的链表上拼拼凑凑,通过调节各节点的next,合并成一个新链表,这是最常用的。但是,这只是针对链表而言,如果是两个数组进行合并的话,还是选用第原创 2015-11-01 21:18:11 · 2563 阅读 · 0 评论 -
《剑指offer》——反转链表
T: 题目描述 输入一个链表,反转链表后,输出链表的所有元素。 constraints: 时间限制:1秒空间限制:32768K考察的是对链表的操作。 跟排序差不多,依次讲节点插入头部,“头插法”。code: /* public class ListNode { int val; ListNode next = null;原创 2015-11-01 21:12:51 · 607 阅读 · 0 评论 -
《剑指offer》——不用加减乘除做加法
T: 题目描述 写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。 不能用加减乘除做,只能求助于位运算啦。。首先来看四个基本操作:在整数的加法中,如果我们将两个加数num1, num2用二进制表示,有如下表示:在二进制中,两个数相加,仔细琢磨,会发现有如下的规律: 如果对应的位上都为1,那么该位上就要归零,并且往左侧进一位; 如果对应的位数不全都原创 2015-11-02 21:24:41 · 1079 阅读 · 0 评论