算法
ggmfengyangdi
小小程序猿
展开
-
大文件排序
大文件排序对于很大的文件中的内容进行排序,不能和普通的排序一样将所有的数据读取到内存,然后对数据进行排序,因此需要使用外部排序进行整个文件的排序。基本思路首先将文件分割一个个小的文件,对于每个小的文件的内容使用普通的排序方法进行排序,所有的文件排序完毕后,对这些文件两两合并(使用归并的排序的思想进行合并)。最后形成排完序的文件。简单实现<pre style="color: rgb(0, 0, 0);原创 2016-09-22 20:41:41 · 1038 阅读 · 0 评论 -
剑指Offer_09_变态跳台阶
题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。解题思路该题与上一题类似,只是每次可以跳的台阶数不同。原创 2016-08-12 10:31:23 · 176 阅读 · 0 评论 -
剑指Offer_08_跳台阶
题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。 解题思路 这是一个动态规划的题。对于n个台阶,可以是n-1个台阶跳一步得到,也可以是n-2步台阶跳两步得到。因此有递归式 f(n) = f(n-1) + f(n-2); 因此可以使用两种方式递归和循环来实现。原创 2016-08-12 09:43:16 · 149 阅读 · 0 评论 -
剑指Offer_07_斐波那契数列
题目描述 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项。 n<=39. 解题思路 利用递归求解,动态规划保存已求值的结果,提高效率。 利用循环,每次根据保存和前两个值求当前值。原创 2016-08-12 09:29:51 · 192 阅读 · 0 评论 -
剑指Offer_06_旋转数组的最小数字
题目描 述把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。 解题思路 直接查找;折半查找原创 2016-08-12 08:41:54 · 162 阅读 · 0 评论 -
七种排序的实现
1. 冒泡排序 2. 选择排序 3. 快速排序 4. 归并排序 5. 插入排序 6. 希尔排序 7. 堆排序原创 2016-07-20 21:52:47 · 1403 阅读 · 0 评论 -
剑指Offer_05_用两个栈实现队列
题目描述 用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。 解题思路 当一个元素入队时,加入第一个栈。当需要出队时,首先判断第二个栈是否有数据,如果有,第二个栈出栈,否则,将第一个栈的元素依次出栈,入第二个栈,然后第二个栈出栈。原创 2016-08-11 11:12:12 · 194 阅读 · 0 评论 -
剑指Offer_44_翻转单词顺序列
题目描述牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么?解题思路 解法1 翻转整个字原创 2016-08-23 11:21:05 · 218 阅读 · 0 评论 -
剑指Offer_43_左旋转字符串
题目描述汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它!解题思路首先要确定需要左移的位数,如果大于字符串长度,则需要取模,如果是负数,则表示右移,那么就是左移数原创 2016-08-23 10:49:33 · 291 阅读 · 0 评论 -
剑指Offer_42_和为S的两个数字
题目描述输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。 输出描述:对应每个测试案例,输出两个数,小的先输出。解题思路利用两个指针分别指数组开始和结尾,然后将两指针的值相加,大于给定值,那么尾指针向前移动,因为此时,如果移动开始指针,那么所有的值和结尾指针相加都大于给定值。同理,比给定值小,那么向后移动开始指针。与给定值原创 2016-08-23 10:22:24 · 247 阅读 · 0 评论 -
剑指Offer_41_和为S的连续正数序列
题目描述小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck! 输出描述:解题思路用两个指针指向序列中最小值和最原创 2016-08-23 10:19:27 · 298 阅读 · 0 评论 -
剑指Offer_04_重建二叉树
题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。 解题思路 首先根据中序和前序遍历的特点,找出跟结点,然后根据根节点将数组划分成两段,一个是根结点的左子树,一个是根结点的右子树。然后递归调用,直至完成。原创 2016-08-11 11:01:21 · 174 阅读 · 0 评论 -
剑指Offer_03_从尾到头打印链表
题目描述输入一个链表,从尾到头打印链表每个节点的值。输入描述:输入为链表的表头输出描述:输出为需要打印的“新链表”的表头解题思路递归打印,首先打印结点的子列表,然后打印结点本身。原创 2016-08-11 10:34:51 · 198 阅读 · 0 评论 -
剑指Offer_66_机器人的运动范围
题目描述地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。请问该机器人能够达到多少个格子?解题思路使用回溯法来做。每次可以往上下左右走,没走原创 2016-09-01 12:40:22 · 412 阅读 · 0 评论 -
剑指Offer_65_矩阵中的路径
题目描述请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。 例如 a b c e s f c s a d e e 矩阵中包含一条字符串”bcced”的路径,但是矩阵中不包含”abcb”路径,因为字符串的第一个字符b占据了矩原创 2016-09-01 12:32:43 · 369 阅读 · 0 评论 -
剑指Offer_64_滑动窗口的最大值
题目描述给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6,6,6,5}; 针对数组{2,3,4,2,6,2,5,1}的滑动窗口有以下6个: {[2,3,4],2,6,2,5,1}, {2,[3,4,2],6,2,5,1}, {2,3,[4,2,6],2,5,1原创 2016-09-01 12:26:05 · 428 阅读 · 0 评论 -
剑指Offer_63_数据流中的中位数
题目描述如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。解题思路用两个推保存数据,保持两个堆的数据保持平衡(元素个数相差不超过1)大顶堆存放的数据要比小顶堆的数据小当两个推中元素为偶数个,将新加入元素加入到大顶堆,如果要加入的数据,比小顶堆的最小元素大,先将该元素原创 2016-09-01 11:16:12 · 375 阅读 · 0 评论 -
剑指Offer_10_矩形覆盖
题目描述 我们可以用2×1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2×1的小矩形无重叠地覆盖一个2×n的大矩形,总共有多少种方法? 解题思路 n个矩形可以横着放或者竖着放,则最后一块可以是横着放的或者,最后两个横着放,可以得到公式f(n)=f(n−1)+f(n−2)f(n) = f(n-1) + f(n-2),则该题与斐波那契数列是类似的,可以使用递归和循环来实现。原创 2016-08-12 10:55:10 · 223 阅读 · 0 评论 -
剑指Offer_45_扑克牌顺子
题目描述LL今天心情特别好,因为他去买了一副扑克牌,发现里面居然有2个大王,2个小王(一副牌原本是54张^_^)…他随机从中抽出了5张牌,想测测自己的手气,看看能不能抽到顺子,如果抽到的话,他决定去买体育彩票,嘿嘿!!“红心A,黑桃3,小王,大王,方片5”,“Oh My God!”不是顺子…..LL不高兴了,他想了想,决定大/小王可以看成任何数字,并且A看作1,J为11,Q为12,K为13。上面的5原创 2016-08-24 14:13:54 · 333 阅读 · 2 评论 -
剑指Offer_54_字符流中第一个不重复的字符
题目描述请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符”go”时,第一个只出现一次的字符是”g”。当从该字符流中读出前六个字符“google”时,第一个只出现一次的字符是”l”。 输出描述:如果当前字符流没有存在出现一次的字符,返回#字符。解题思路每次插入一个字符,就判断该字符是否已经出现,对应位置的值,如果为-1,则说明没有出现过,就该对应的值改为当前字符原创 2016-08-27 10:17:44 · 510 阅读 · 0 评论 -
剑指Offer_53_表示数值的字符串
题目描述请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串”+100”,”5e2”,”-123”,”3.1416”和”-1E-16”都表示数值。 但是”12e”,”1a3.14”,”1.2.3”,”+-5”和”12e+4.3”都不是。解题思路首先判断是否有符号(+或者-),如果有,则对后面的字符串判断 首先需要扫描数字直到结束或是遇到其他字符,结束则返回true,否则继续按情原创 2016-08-27 09:38:43 · 517 阅读 · 0 评论 -
剑指Offer_52_正则表达式匹配
题目描述请实现一个函数用来匹配包括’.’和’‘的正则表达式。模式中的字符’.’表示任意一个字符,而’‘表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串”aaa”与模式”a.a”和”ab*ac*a”匹配,但是与”aa.a”和”ab*a”均不匹配解题思路分情况讨论: 1. 需要匹配的字符串和模式字符串都已经遍历完成,那么就是匹配成功的。 2.原创 2016-08-27 09:20:44 · 408 阅读 · 0 评论 -
剑指Offer_51_构建乘积数组
题目描述给定一个数组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]。不能使用除法。解题思路对于每一个B[i],首先从前往后求解,先得到i前面的A[i]相乘结果,B[i] = B[i-1]×A[i-1] 同理从后开始,直到i+1,就可以得到B[i]。实现public class Solut原创 2016-08-26 11:12:40 · 215 阅读 · 0 评论 -
剑指Offer_50_数组中重复的数字
题目描述在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是重复的数字2或者3。解题思路数组大小是n,且数组中的数字是[0,n-1]范围的,那么如果所有数字都不同的话,每个数字能放自己对应的位置,比如0,存放原创 2016-08-26 10:58:20 · 200 阅读 · 0 评论 -
剑指Offer_49_把字符串转换成整数
题目描述将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0 输入描述:输入一个字符串,包括数字字母符号,可以为空输出描述:如果是合法的数值表达则返回该数字,否则返回0输入例子:+2147483647 1a33输出例子:2147483647 0解题思路遍历字符串,首先判断第一位是否为+,-,如果是,则跳过。计算原创 2016-08-26 10:29:12 · 410 阅读 · 2 评论 -
剑指Offer_48_不用加减乘除做加法
题目描述写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。解题思路我们可以利用位运算,两个数相加先不考虑进位,得到结果,如5+17,101+10001,在不考虑进位时,得到的是10100,也即两个数异或。然后再对得到的数加上进位数。进位数只有在两个数均为1的情况下发生进位(相与为1),相与之后得到的结果是当前不为0的为的下一个位需要加上进位数,因此对相与结果左移一位。然后原创 2016-08-26 09:55:05 · 245 阅读 · 0 评论 -
剑指Offer_47_求1+2+3+...+n
题目描述求1+2+3+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。解题思路使用一个实例变量保存结果,每次递归调用(返回值为boolean)和 n 是否大于 0来判断循环是否结束实现public class Solution { int sum = 0; public int Sum_Solution(in原创 2016-08-26 09:23:47 · 283 阅读 · 0 评论 -
剑指Offer_17_树的子结构
题目描述 输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构) 解题思路 首先判断 A 和 B 是否是空,如果为空,返回false;否则找到 A 和 B 的根结点相同的结点,然后依次比较。可以用递归的形式在 A 中找 B 的根结点。原创 2016-08-14 11:19:13 · 176 阅读 · 0 评论 -
剑指Offer_16_合并两个排序的链表
题目描述 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。 解题思路 依次从头开始遍历,比较大小,将小的结点插入新的链表,并将指针后移,直到两个链表遍历完成。原创 2016-08-14 10:54:21 · 227 阅读 · 0 评论 -
剑指Offer_15_反转链表
题目描述输入一个链表,反转链表后,输出链表的所有元素。解题思路从头结点开始遍历,插入新的链表,每次在链表头插入结点。实现/*结点定义*/ public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; } } /*实现*/ public原创 2016-08-14 10:20:43 · 193 阅读 · 0 评论 -
剑指Offer_14_链表中倒数第k个结点
题目描述 输入一个链表,输出该链表中倒数第k个结点。 解题思路 利用两个指针,第一个指针先走k步,然后第二个指针从头开始走,当第一个指针到达最后时,第二个指针指向的结点就是倒数k个。如果第一个指针走到链表的尾部还没有到达k,那么返回null。原创 2016-08-14 09:40:49 · 122 阅读 · 0 评论 -
剑指Offer_12_数值的整数次方
题目描述 给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。 解题思路 当exponent为0时,返回1,当exponent大于0,那么循环exponent次,每次对结果乘以base,最终返回结果。当exponent小于0,则循环exponent的绝对值次,每次对结果乘以base,然后对结果取倒数并返回。对于base为0,那么返回0。原创 2016-08-13 10:25:09 · 205 阅读 · 0 评论 -
剑指Offer_13_调整数组顺序使奇数位于偶数前面
题目描述 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。 解题思路 使用两个指针,一个指向当前第一个偶数,第二个指针则寻找该偶数后面第一个奇数,然后将奇数插入到第一个偶数的位置。原创 2016-08-13 10:55:24 · 239 阅读 · 0 评论 -
剑指Offer_11_二进制中1的个数
题目描述 输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。 解题思路 利用1移位,与数的每一位比较,当与的结果不为0,则说明当前位为1,count加1,否则为0,直到1移位后为0,最后返回count。原创 2016-08-13 09:29:56 · 229 阅读 · 0 评论 -
剑指Offer_46_孩子们的游戏(圆圈中最后剩下的数)
题目描述每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此。HF作为牛客的资深元老,自然也准备了一些小游戏。其中,有个游戏是这样的:首先,让小朋友们围成一个大圈。然后,他随机指定一个数m,让编号为0的小朋友开始报数。每次喊到m-1的那个小朋友要出列唱首歌,然后可以在礼品箱中任意的挑选礼物,并且不再回到圈中,从他的下一个小朋友开始,继续0…m-1报数….这样下去….直到剩下最后一原创 2016-08-24 20:40:54 · 380 阅读 · 0 评论 -
剑指Offer_62_二叉搜索树的第k个结点
题目描述给定一颗二叉搜索树,请找出其中的第k小的结点。例如, 5 / \ 3 7 /\ /\ 2 4 6 8 中,按结点数值大小顺序第三个结点的值为4。解题思路二叉搜索树的中序遍历得到的结果就是以小到大的排序顺序,因此可以使用中序遍历,每次遍历记录当前结点是第几个结点,当到期望的结点时,返回。实现/*树结点的定义*/ public class TreeNode { int val = 0;原创 2016-09-01 10:46:53 · 272 阅读 · 0 评论 -
剑指Offer_61_序列化二叉树
题目描述请实现两个函数,分别用来序列化和反序列化二叉树解题思路使用前序遍历,将遇到的结点添加到字符串中,遇到null则将一个#添加要序列化字符串中。反序列化时,每次读取根结点,然后读取其左结点,遇到#(null)时,返回上层。实现/*树结点定义*/ public class TreeNode { int val = 0; TreeNode left = null; TreeN原创 2016-09-01 10:06:22 · 215 阅读 · 0 评论 -
剑指Offer_40_数组中只出现一次的数字
题目描述一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。解题思路两个相同的数异或得到 0,任何数和 0 异或得到原来的数。可以将所有的数异或(其实就是两个出现一次的数异或),得到一个数 a,然后判断 a 中第一位不为 0 的位,也即第一位不相同的位。然后根据该为是 1 和 0 的情况分成两组数(相同的数肯定在同一组),两组分别对组内所有数进行异或,最后就得原创 2016-08-22 10:15:55 · 238 阅读 · 0 评论 -
剑指Offer_34_找出字符串中第一个只出现一次的字符
题目描述找出字符串中第一个只出现一次的字符详细描述:接口说明原型:bool FindChar(char* pInputString, char* pChar);输入参数:char* pInputString:字符串输出参数(指针指向的内存区域保证有效):char* pChar:第一个只出现一次的字符如果无此字符 请输出’.’输入描述: 输入一串字符,由小写字母组成输出描述: 输出一个字符输入例子:a原创 2016-08-21 09:41:29 · 260 阅读 · 0 评论 -
剑指Offer_55_链表中环的入口结点
题目描述一个链表中包含环,请找出该链表的环的入口结点。解题思路先用两个指针,一个一次走两步,一个一次走一步,直到两个节点相遇(有环的话) 然后再定义一个指针重新重头开始走,每次走一步,知道与之前的一步的指针相遇就是环的开始节点实现/*链表结点定义*/ public class ListNode { int val; ListNode next = null; ListNod原创 2016-08-27 10:44:45 · 451 阅读 · 0 评论