剑指offer
文章平均质量分 61
u010667082
这个作者很懒,什么都没留下…
展开
-
面试30 求数组中最小的k个数
其实最直观的做法就是对数组从小到大排序,然后取前k个数。时间复杂度取决于排序算法#include#include#include#include#include#include#includeusing namespace std;int Partition(int *a,int start,int end){ int i=start,j=end; in原创 2015-08-01 10:28:38 · 299 阅读 · 0 评论 -
面试题44扑克牌的顺序
面试题44:扑克牌的顺子:从扑克牌中随机抽5张牌,判断是不是顺子,即5张牌是不是连续的,2~10为数字本身,A为1,J为11 Q为12,K为13而大小王可以看成任意的数字思路:大小王用0表示,输入数组的范围为0~13对输入的数组统计0的个数,然后进行排序设立两个游标smallIndex=numberOfZero,和bigIndex=smallIndex+1遍历数组统计相邻数的间隔,如果原创 2015-09-10 15:48:56 · 1278 阅读 · 0 评论 -
面试题41和为S的两个数字VS和为s的连续正数序列
面试题41输入一个递增排序的数组和一个数字s,在数组中查找两个数使它们的和正好是s如果有多对数字的和等于s输出任意一对即可。思路:最简单的办法逐个遍历数组中数,每遍历一个数时将该数与后面的数相加判断是否和为s;好的点方法:设立两个指针,第一个指向第一个数字,第二个指针指向最后一个,和==sum的跳出循环,cursum小于sum的第一个指针后移,否则最后一个指针前移i=0,j=len原创 2015-09-09 14:16:35 · 423 阅读 · 0 评论 -
面试题36数组中的逆序对
面试题36数组中的逆序对思路:最简单的方法。从头到尾遍历数组,每遍历一个数时,逐个比较该数字和它后面的数字的大小累加逆序对。新颖的办法:先把数组分隔成子数组,先统计出子数组内部的逆序对的数目,再统计出两个相邻数组之间的逆序对的数目统计逆序对的过程是一个归并排序的过程在统计相邻数组的逆序对时,从大的往小的比,如果第一个数组的数字小于或等于第二个数组的数字则不构成逆序对,否则累加逆序对的个数。原创 2015-09-08 10:48:37 · 387 阅读 · 0 评论 -
面试题42反转单词顺序VS左旋字符串(循环左移字符串)
#include#include#include#includeusing namespace std;// 翻转单词//反转字符串void Reverse(char *pBegin,char *pEnd){ if(pBegin==NULL||pEnd==NULL) { return ; } while(pBegin<p原创 2015-08-01 16:00:36 · 330 阅读 · 0 评论 -
面试题30 最小的K个数
思路:最直观的想法就是先排序再取前k个数,这种方法的时间复杂度取决于排序的算法。用partition()函数找枢纽元素,是元素下标为k-1//适合数据量比较大的算法:用multiset>容器存储k个变量并实时更新里面的元素函数接口:void GetLeastKNumber(int *a,int length,multiset>&leastNumbers,int k);#原创 2015-08-27 15:08:54 · 276 阅读 · 0 评论 -
面试题31连续数组的最大和
面试题31连续数组的最大和思路:最笨最直接的做法枚举数组的所有子数组并求出它们的和。长度为n的数组一共有n*(n-1)/2个子数组时间复杂度为O(n^2)// 遍历数组同时设立两个变量cursum和maxsum当cursum<=0时跟新cursum为当前元素值。每次更新最大值maxsum的值即可//用中规中矩的动态规划法用函数f(i)表示以第i个数字结尾的子数组的最大和原创 2015-08-27 15:53:59 · 281 阅读 · 0 评论 -
面试题29数组中出现次数超过一半的数字
面试题29数组中出现次数超过一半的数字:思路:最直观的思路就是对数组进行排序然后取中位数。时间复杂度取决于排序算法。或用Partition()函数找一个枢纽元素将数组分为两部分一部分比枢纽元素小,另一部分比枢纽元素大且枢纽元素的位置要在数组的中位数。新颖的想法:利用数组的特点,顺序遍历数组的时候保存两个值一个数组中的数字一个是该数字出现的次数若数字相同则次数加1数字不同则次数减一注原创 2015-08-27 14:31:52 · 316 阅读 · 0 评论 -
面试题24二叉搜索树的后序遍历序列cpp
思路:二叉搜索树的性质满足根节点大于左子树的的节点,小于右子树的节点。后序遍历序列最后一个元素即为根节点,根据左子树的的值小于根结节点,遍历序列得出左子树的长度,和右子树的长度,同时检查右子树是否满足都大于根结节点这一性质,再递归。有点类似二叉树的建立函数接口:bool IsPostOrder(int *sequence,int length);#include#include原创 2015-08-25 11:02:23 · 349 阅读 · 0 评论 -
面试题23从上往下打印二叉树
面试题23从上往下打印二叉树 思路:本质为树的层序遍历,设立一个队列。从上到下访问即可#include#include#include#include#includeusing namespace std; //面试题23从上往下打印二叉树 思路:本质为树的层序遍历,设立一个队列。从上到下访问即可typedef struct BinaryTreeNode{ in原创 2015-08-25 10:12:39 · 266 阅读 · 0 评论 -
面试题21包含min函数的栈
思路:栈是先进后出的数据结构,栈的基本操作为入栈和出栈。设计包含min函数的栈只要在入栈和出栈后能找到min值行,设立一个辅助栈来存最小值,入栈时:当辅助栈为空或新入栈元素比辅助栈的栈顶元素要小时,则将新元素入辅助栈,否则将辅助栈的栈顶元素再次入栈;出栈时只需将两个栈的栈顶元素出栈即可。函数接口 template void StackWithMIn::push(const type&v原创 2015-08-24 22:37:17 · 250 阅读 · 0 评论 -
面试题22 栈的压入弹出序列
思路:根据弹出序列的顺序确定哪些元素已入栈。栈为空或是栈顶元素与弹出序列不一致,则将压入序列的元素入栈直到和栈顶元素和弹出序列相当等。大循环终止条件while(indexPop 函数接口: bool IsPopOrder(int*pushArray,int*popArray,int length);#include#include#include#includeusing原创 2015-08-25 09:51:42 · 332 阅读 · 0 评论 -
面试题20顺时针打印矩阵
面试题20顺时针打印矩阵 思路:对于m行n列的矩阵需要打印元素的个数为m*n个,设立4个变量i1,i2,i3,i4,从左到右,从上到下,从右到左,从下到上,顺时打印即可。循环终止条while(count函数接口: void PrintMatrixClockWisely(int** a,int row,int column); #include#include#inclu原创 2015-08-24 19:51:18 · 352 阅读 · 0 评论 -
面试题7两个栈实现一个队列和两个队列实现一个栈
两个栈实现一个队列,本质上是用两个栈去模拟队列的入队和出队。stack1,和stack2 去模拟,入队时只在stack1 中将元素入栈, 出队时只将stack2的栈顶元素出队,出队时 1)首先判断stack2 是否为空,若stack2 为空将则将stack1中的所有元素弹出压入stack2 2)此时再判断栈2是否为空,若为空则抛出异常,不为空则将stack2的栈顶元素弹出原创 2015-07-12 21:33:15 · 290 阅读 · 0 评论 -
面试28字符串的排列组合
字符串的全排列:分两个步骤:1)第一个步求所有可能出现在第一个位置的的字符,即把第一个字符依次和后面的字符交换 2)第二部固定第一个字符求后面的字符的所有排列以abc 为例 (1)所有可能出现在第一个位置的的字符字符有三种情况 abc bac cba (2)固定第一个字符求后面的字符的所有排列 abc--->abc---->acb转载 2015-07-13 12:52:59 · 341 阅读 · 0 评论 -
面试题12打印1到最大的n位数
#include#include#include#includeusing namespace std;void Print1ToMaxNDigitsRecursively(char *numbers,int length,int index);void Print(char *str);//打印用字符串表示一个n位的大数前面要去0bool IncrementOne(char *nu原创 2015-07-14 16:38:47 · 238 阅读 · 0 评论 -
面试题43:n个骰子的点数
注意点:n 个骰子的面朝上点数和的范围【n,6n】 每个骰子的范围【1,6】 n 个骰子分为两部分,第一骰子和其余的n-1个骰子 递归的终止条件为当前其余骰子个数为0个#include#include#include#includeusing namespace std;int maxValue=6;//骰子的最大点数void Proba原创 2015-07-14 16:51:05 · 421 阅读 · 0 评论 -
剑指offer总结
面试题12 打印1到最大的n位数思路:此题是一个大数问题,本质上可以归结为一个字符串的加1操作。需要注意溢出条件,动态分配内存的初始化不能忘记‘\0’ 勿忘释放内存。打印大数时不能忘记前面的去零操作字符串的加法是从低位开始的number[n-1];函数接口:voidPrint1ToMaxNDigits(int n)Bool IncrementOne(char *numbe原创 2015-11-05 19:58:49 · 427 阅读 · 0 评论