剑指Offer
清文
低调前行
展开
-
剑指Offer-4-替换空格
题目:请实现一个函数,把字符串中的每个空格替换成“%20”。例如输入“We are happy.”,这输出“We%20are%20happy.”#include <iostream>using namespace std;void replace(char* str) { int BlankCount = 0; int pos = 0; while(str[pos] !=原创 2015-09-26 15:36:21 · 363 阅读 · 0 评论 -
剑指Offer-21-包含min函数的栈
题目: 定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数,在该栈中,调用min,push,pop的时间复杂度都为O(1)。 思路: 模拟栈push,pop过程#include <iostream>#include <stack>using namespace std;template <typename T> class MinStack{public:原创 2015-11-15 19:42:11 · 260 阅读 · 0 评论 -
剑指Offer-22-栈的压入、弹出序列
题目: 判断一数字序列是否为这些数字入栈的一种出栈方式(前提:栈中的数字不重复),比如,栈的序列为:1 2 3 4 5,那么4 5 3 2 1为一种弹出序列, 4 3 5 1 2不是。 思路: 开辟一个辅助栈,模拟入栈出栈过程(假设pPush为入栈序列,pPop为出战序列)。 1.辅助栈为空或辅助栈栈顶元素与出栈序列指向元素不同,pPush中的元素依次压入辅助栈,直至新压入的元素与辅助栈栈顶原创 2015-11-15 19:58:37 · 260 阅读 · 0 评论 -
剑指Offer-23-从上往下打印二叉树
题目: 从上往下打印二叉树的每个结点,同一层的结点按照从左到右的顺序打印。 思路: 实际该题即为二叉树的层次遍历,可以使用一个辅助队列,打印完某结点后将其左结点和右结点依次加入队列,循环遍历队列,直至队列为空。#include <iostream>#include <queue>using namespace std;struct BinaryTreeNode { int m_nV原创 2015-11-16 09:44:27 · 281 阅读 · 0 评论 -
剑指Offer-25-二叉树中和为某一值的路径
题目: 输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。从树的根结点开始一直到叶结点所经过的结点形成一条路径。 思路: 使用辅助栈保存目前遍历所得路径,使用前序遍历的方式遍历二叉树。 1.如果目前路径所有结点值的和等于期望值,并且该结点为叶节点,打印该辅助栈保存的路径。 2.如果目前路径所有结点值的和小于期望值,递归调用函数,传入该结点的子结点。 3.如果目前路径原创 2015-11-16 11:19:52 · 309 阅读 · 0 评论 -
剑指Offer-24-二叉搜索树的后序遍历序列
题目: 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。假设输入数组的任意两个数字都不相同。 思路: 二叉树的后序遍历为左右中,同时,二叉搜索树的特点为左子树的所有结点均小于根结点,右子树的所有结点均大于根结点。 因此从输入数组的最后一个元素对二叉树后序遍历结果进行切分,切分结果必须保证左子树的所有结点均小于根结点,右子树的所有结点均大于根结点,否则该树不是二叉搜索树。#in原创 2015-11-16 10:20:33 · 303 阅读 · 0 评论 -
剑指Offer-28-字符串排列
#include <iostream>using namespace std;void print(char* str, int length);void permutation(char* str, int begin, int length);void permutation(char* str, int length) { if (str == NULL || length <=原创 2015-11-22 16:02:55 · 255 阅读 · 0 评论 -
剑指Offer-27-二叉排序树转双向链表
#include <iostream>using namespace std;struct BinaryTreeNode { int m_nValue; struct BinaryTreeNode* m_pLeft; struct BinaryTreeNode* m_pRight;};BinaryTreeNode* convert(BinaryTreeNode *pRoo原创 2015-11-22 15:36:45 · 333 阅读 · 0 评论 -
剑指Offer-29-查找数组中出现次数超过一般的元素
思路: 数组中有一个数字出现的次数超过数组长度的一半,也就是说它出现的次数比其他所有数字出现次数的和还要多。因此我们可以考虑在遍历数组的时候保存两个值: 一个是数组中的一个数字, 一个是次数。当我们遍历到下~个数字的时候,如果下一个数字和我们之前保存的数字相同,则次数加l :如果下一个数字和我们之前保存的数字,不同,则次数减1 。如果次数为霉,我们需要保存下一个数字,并把次数设为1 。由于我们要找原创 2015-11-22 16:42:16 · 430 阅读 · 0 评论 -
动态规划-LIS
最长递增子序列(LIS)的问题是要找到一个给定序列的最长子序列的长度,使得子序列中的所有元素被排序的顺序增加。例如,{10,22,9,33,21,50,41,60,80} LIS的长度是6和 LIS为{10,22,33,50,60,80}。最优子结构:对于长度为N的数组A[N] = {a0, a1, a2, …, an-1},假设假设我们想求以aj结尾的最大递增子序列长度,设为L[j],那么L[j原创 2015-11-24 16:55:34 · 542 阅读 · 0 评论 -
剑指Offer-31-连续子数组的最大和
题目: 输入一个整型数组,数组里有正数也有负数。数组中一个或连续的多个整数组成一个子树组。求所有子数组的和的最大值。要求时间复杂度为O(n)。 例如输入的数组为{1,-2,3,10,-4,7,2,-5},和最大的子数组为{3,10,-4,7,2,},因此输出为该子数组的和18 思路:动态规划 假设f(i)为以第i个数字结尾的子数组的最大和,那么f(i)=A[i], f(i-1)<=0f(i)原创 2015-11-24 15:59:05 · 258 阅读 · 0 评论 -
剑指Offer-30-最小的k个数-最大堆
先创建一个大小为K的数据容器来存储最小的K个数,接下来我们每次从输入的n个整数中读入一个数,如果容器中已有的数字少于K,则直接把这次读入的整数放入容器中;如果容器中已有K个数,就是容器满了,此时我们不能插入新的数字而只能替换已有的数字了。找出这K个数的最大值,然后拿这次待插入的整数和最大值相比较。如果待插入的值比当前已有的最大值小,则用这个数替换当前已有的最大值;如果待插入的值比当前已有的最大值还大原创 2015-11-24 14:58:25 · 480 阅读 · 0 评论 -
剑指Offer-29-数组出现次数超过一半的数字-基于Partition函数的O(n)算法
如果把这个数组排序,那么排序之后位于数组中间的数字一定就是出现次数超过数组长度一半的数字。也就是说,这个数字就是是统计学中的中位数。 在随机快速排序算法中,我们现在数组中随机选择一个数字,然后调整数组中数字的顺序,使得比选中数字小的数字都排在它的左边,比选中的数字大的数字都排在它的右边。如果这个选中的数字的下标正好是n/2(中位数),那么这个数字就是待定的出现次数超过一半的数字的候选(因为有一种可原创 2015-11-24 13:44:39 · 734 阅读 · 0 评论 -
剑指Offer-30-最小的k个数
题目: 输入n个整数,找出其中最小的k个数。例如输入4,5,1,6,2,7,3,8,则最小的4个数字是4,1,2,3. 思路1:使用Partition函数的O(n)算法 可以基于Partition函数来解决这个问题。如果基于数组的第k个数字来调整,使得比第k个数字小的所有数字都位于数组的左边,比第k个数字大的所有数字都位于数组的右边。这样调整之后,位于数组中左边的k个数字就是最小的k 个数字(原创 2015-11-24 14:16:40 · 289 阅读 · 0 评论 -
剑指Offer-26-复杂链表的复制
题目: 有一个复杂链表,其结点除了有一个m_pNext指针指向下一个结点外,还有一个m_pSibling指向链表中的任一结点或者NULL。其结点的C++定义如下: struct ComplexNode { int m_nValue; ComplexNode* m_pNext; ComplexNode* m_pSibling; }; 请完成函数Comple原创 2015-11-21 11:27:01 · 363 阅读 · 0 评论 -
剑指Offer-20-顺时针打印矩阵
题目: 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每个数字。比如1 2 3 4 5 6 7 89 10 11 1213 14 15 16打印结果为 1 2 3 4 8 12 16 15 14 13 9 5 6 7 11 10思路: 顺时针打印实际上是每次循环打印一圈矩阵的外层,然后圆圈不断向内缩小,每次打印的起始点实际为(i,i)i=0,1,2,…。原创 2015-11-14 12:13:28 · 241 阅读 · 0 评论 -
剑指Offer-19-二叉树的镜像
题目: 完成一个函数,输入一个二叉树,该函数输入二叉树的镜像。原二叉树 8 1 23 4则输出 8 2 1 3 4思路: 前序遍历二叉树的每个结点,如果遍历到的结点有子结点,就交换它的两个左右子节点,当交换完所有非叶子结点的左右子结点之后,就得到了二叉树的镜像。#include <原创 2015-11-14 11:49:37 · 335 阅读 · 0 评论 -
剑指Offer-18-树的子结构
题目: 输入两棵二叉树A,B,判断B是不是A的子树。 思路 1.遍历二叉树A,查找与二叉树B根节点值相同的结点R,若存在,进行第二步比较。 2.判断树A中以R为根节点的子树是不是和树B具有相同的结构,使用递归的思路:如果结点R的值和树B的根节点值不相同,则以R为根结点的子树和树B肯定结构不同;如果它们的值相同,那么递归判断它们各自的左右结点是不是相同。 递归的终止条件是到达树A或树B的叶结原创 2015-11-14 11:41:29 · 296 阅读 · 0 评论 -
剑指Offer-3-二维数组中的查找
题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有改整数。#include <iostream>using namespace std;bool search(int* matrix,int rows,int cols,int number) { int row = 0,col原创 2015-09-26 15:30:35 · 284 阅读 · 0 评论 -
剑指Offer-5-从尾到头打印链表
题目:输入一个链表结点,从尾到头反过来打印出每个结点的值。1.非递归实现#include <iostream>#include <stack>using namespace std;struct LNode{ int value; struct LNode *next;};void insert(struct LNode** head,int value) { L原创 2015-09-26 15:43:57 · 298 阅读 · 0 评论 -
剑指Offer-7-用两个栈实现队列/用两个队列实现栈
1.两个栈实现队列import java.util.Stack;public class CQueue<T> { private Stack<T> s1 = new Stack<>(), s2 = new Stack<>(); public void EnQueue(T value) { s1.push(value); } public T DeQueue原创 2015-09-26 19:04:39 · 320 阅读 · 0 评论 -
剑指Offer-6-重建二叉树
题目:输入某二叉树前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不包含重复的数字。例如输入前序遍历序列{1, 2, 4, 7, 3, 5, 6, 8}和中序遍历序列{4, 7, 2, 1, 5, 3, 8, 6},则重建出该二叉树。 struct BinaryTreeNode { int m_nValue; BinaryTreeNode *m原创 2015-09-27 15:26:35 · 351 阅读 · 0 评论 -
剑指Offer-9-斐波拉契数列
递归实现+非递归实现#include <iostream>using namespace std;//递归实现斐波那契数列 long long Fibonacci_Recursion(long long n) { if(n == 0) return 0; if(n == 1) return 1; return Fibonacci_Recursion(n - 1)+Fib原创 2015-09-27 16:20:11 · 275 阅读 · 0 评论 -
剑指Offer-12-打印1到最大的n位数
package char3;public class Print1ToMaxOfNDigits { //采用字符串模拟加法 void Print1ToMaxOfNDigits(int n) { if(n<=0) return; char number[] = new char[n]; for(int i = 0;i原创 2015-11-09 20:56:07 · 285 阅读 · 0 评论 -
大数相加
竖式计算 1.比较2个数组长度,结果取较长的+1 2.对齐竖式所加位,结果放入结果数组 3.对结果数组进行进位操作package char3;public class BigIntAdd { char[] add(char[] a,char[] b){ if(a.length<=0 || b.length<=0) return null;原创 2015-11-09 21:54:22 · 313 阅读 · 0 评论 -
剑指Offer-11-数值的整数次方
package char3;/** * 数值的整数次方 * */public class Power { boolean g_InvalidInput = false; double power(double base,int exponent) { if(exponent < 0 && equal(base,0.0)) { g_Inv原创 2015-11-09 20:55:08 · 286 阅读 · 0 评论 -
剑指Offer-10-二进制中1的个数
package char2;public class NumberOfOne { /* 统计二进制中1的个数 */ int f1_NumberOfOne(int number) { int count = 0; while(number != 0) { if((number & 1) == 1) co原创 2015-11-09 20:53:51 · 296 阅读 · 0 评论 -
剑指Offer-14-调整数组顺序使奇数位于偶数之前
题目:输入一个整数数组,实现一个函数来调整该数组中的数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。 思路: 1、两个指针,1个指向数组前过滤奇数,1个指向数组末尾过滤偶数 2、前向指针不断后移,直至指向偶数或越界 3、后向指针不断迁移,直至指向奇数或越界#include <iostream>using namespace std;void ReorderOddEv原创 2015-11-11 20:33:46 · 257 阅读 · 0 评论 -
剑指Offer-13-在O(1)时间删除链表结点
题目:给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点。链表结点与函数的定义如下:#include <iostream>using namespace std;struct ListNode { int value; ListNode *pNext;};/** *判断结点是否属于某链表,属于返回true,不属于返回false */bool isE原创 2015-11-11 16:55:29 · 341 阅读 · 0 评论 -
剑指Offer-15-链表中的倒数第k个节点
题目:输入一个链表,查找该链表中的倒数第k个结点 比如链表为{1,2,3,4},则倒数第2个节点为3。 思路: 使用两个指针,第1个指针先走k-1步,然后,两个指针同时前进,知道第一个指针走到链表末尾。 注意:该题应当注意如果k超过链表长度的情况,增加代码鲁棒性。#include <iostream>using namespace std;struct ListNode { int原创 2015-11-12 21:06:16 · 259 阅读 · 0 评论 -
剑指Offer-16-翻转链表
题目: 定义一个函数,输入一个链表的头结点,翻转该链表并输出翻转后的链表。 思路: 1.使用两个指针a,b分别指向待翻转的两个结点,同时为了防止断链,使用一个指针c保存b->next指针,c=b->next。 2.连个结点翻转后,a=b,b=c。 3.循环1,2直至b为NULL。 注意: 1.第一个结点的next指针赋NULL 2.链表为空的情况 3.链表只有一个结点的情况#in原创 2015-11-13 19:13:58 · 342 阅读 · 0 评论 -
剑指Offer-17-合并有序链表
题目: 已知两个分别递增有序的单向链表,将两个有序链表合并为一个有序递增的单向链表。 思路: (1)使用递归的方式 1.使用两个指针pa,pb分别指向两个有序的链表a,b的头结点。 2.如果pa为空返回pb,如果pb为空,返回pa。 3.如果pa,pb均不为空 如果pa->value <= pb->value,使指针head指向pa,并递归pa->next与pb; 4.如果pa->v原创 2015-11-13 22:06:11 · 322 阅读 · 0 评论 -
剑指Offer-26-复杂链表的复制-优化
前面文章所使用的方法时间主要花费在定位结点的m_pSibling上面,我们试着在这方面去做优化。 我们还是分为两步: 第一步仍然是复制原始链表上的每个结点N,并创建N’,然后把这些创建出来的结点链接起来。这一次,我们把新创建的每个结点N’链接在原先结点N的后面。 代码如下:void CloneNodes(ComplexListNode *pHead) { ComplexListN原创 2015-11-21 11:58:28 · 321 阅读 · 0 评论