![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
剑指offer
NeoTDX
这个作者很懒,什么都没留下…
展开
-
剑指offer-字符串转化成整数
题目:把一个字符串转换成整数这个题目不难,难点在于输入的判定,目标是,任何输入都有正确的转化值和返回值原创 2015-08-23 10:48:48 · 280 阅读 · 0 评论 -
剑指off-O(1)得到栈的最小元素
题目:实现一个栈,要求可以得到min,pop push min 复杂度O(1) min是得到最小元素,不是得到最小并弹出来分析:用一个辅助栈,每次push的时候都是压入最小的元素,同时弹出偷懒了,用STL的栈简单写一下void push(stack &stack1,stack &stack2,int n){ if (stack1.empty()) { st原创 2015-07-19 15:50:41 · 259 阅读 · 0 评论 -
剑指off-用两个栈试下你队列
//两个栈实现一个队列void cqueue::appendTail(int num){ stack1.push(num);}void cqueue::deleteHead(){ if (stack2.empty()) { while (!stack1.empty()) { int temp=stack1.top();原创 2015-07-13 10:43:12 · 358 阅读 · 0 评论 -
剑指off-从尾到头打印
//从尾到头打印链表struct ListNode{ string key; ListNode* next;};bool printlistreversingly(ListNode* pHead){ if (pHead==NULL) { return false; } stack sk; while (pHead!=NULL原创 2015-07-13 10:43:59 · 261 阅读 · 0 评论 -
剑指off-给员工年龄排序
//题目给几万个员工的年龄排序,要求时间复杂度是O(n);//第一步先统计1-99,然后给arr重新赋值//这是计数排序?void AgesSort(int arr[],int length){ int oldest=99; int rangeold[100]={0}; for (int i=0; i rangeold[原创 2015-07-13 11:57:54 · 316 阅读 · 0 评论 -
剑指off-求旋转数组最小值
//求旋转数组的最小值//固定最后一个为基准,从头开始,找到第一个比最后一个小的,返回其值int min(int arr[],int length){ int result=-1; int area=length-1; if (length<1) { return result; } for (int i=0; i<lengt原创 2015-07-13 15:41:44 · 262 阅读 · 0 评论 -
剑指off-fabonacci
//斐波那契数列//n=0 f=0 n=1 f=1 n>1 f(n-1)+f(n-2)//下面是递归实现,但递归实现是从上到底的,这个效率非常低,因为有好些数字被重复计算了,效率高的方法是用循环int Fibonacci(int n){ if (n<0) { return -1; } if (n==1) { return 1;原创 2015-07-13 17:37:52 · 338 阅读 · 0 评论 -
剑指offer-树中两个节点的最低公共祖先
题目:求树中两个节点的最低公共最新。分析:这到底是怎样的树,影响了解决算法。第一种,二叉搜索树。二叉搜索树的特点,左子树都比根节点小,右子树都比根节点大。那么最低得公共祖先的性质就是第一个在两个节点值中间的节点。如果节点比两个节点都大,说明最低公共祖先在左子树上,如果节点比两个节点都小,说明最低公共祖先在右子树上。第二种,普通的树,但是有指向父节点的指针。这样就变成了求两个原创 2015-08-23 13:28:41 · 293 阅读 · 0 评论 -
剑指off-不能被继承的类
题目:不能被继承的类分析:子类继承父类,会使用父类的构造和析构函数,那么把父类的构造和析构函数都设置成私有就不会被继承了。那么要进行实例化就要用静态函数来new。题目48原创 2015-08-22 23:30:08 · 250 阅读 · 0 评论 -
剑指off-输入s打印所有和为s的连续正数序列
题目:输入s打印所有和为s的连续正数序列分析:方法是弄个像滑动窗口一样的东西,用两个指针维护,指针之间的和大于s,small++ 小于s,big--,当small>big的时候结束,代码不写了,很easy原创 2015-07-21 17:32:29 · 252 阅读 · 0 评论 -
剑指off-求两个链表的第一个公共节点
题目:求两个链表的第一个公共节点分析:如果两个链表一样长,怎么解决,一人走一步,判断一下,但是现在每个链表的长度位置,就不能这么做,那么我们先每个链表遍历一次,知道了大家的长度,完后一个快走两步,让他俩长度一致,就可以按照两个链表一样长解决,代码就不写了原创 2015-07-21 15:31:32 · 285 阅读 · 0 评论 -
剑指off-第一个字符串删除第二个字符串中的所有元素
分析:还是上一篇 hash_map应用void delchar(char str[],char del[]){ int hashmap[256]={0}; char *pDel=del; //hash统计 while (*pDel!='\0') { hashmap[*pDel]=1; pDel++; } char原创 2015-07-21 15:03:46 · 315 阅读 · 0 评论 -
剑指off-求最小数字组合
题目:给定几个数字,求最小数字组合分析;可以将数字都转成字符串,然后用qsort进行排序,这个结果就是最小的数字组合值,还解决了组合数字溢出的问题。qsort(待排序数组首地址, 数组中待排序元素数量 , 各元素的占用空间大小 ,指向);//qsort是用快速排序实现的例子qsort(number,length,sizeof(int),cmp);int cmp(int a,in原创 2015-07-21 13:42:16 · 407 阅读 · 0 评论 -
剑指off-找到数组中个数大于总数一半的数字
题目:找到数组中个数大于总数一半的数字,比如 1,7,4,2,4,2,6,2,2,2,2,2,2,2分析:大于一半就是比其他的个数总和还多,设置一个变量now保存当前值,一个变量保存now的次数count,遍历数组,如何和当前值一样,count+1,如果不一样-1,如果count=0了,改变now值为arr[i]count 置1int MoreThanHalf(int arr[],int原创 2015-07-20 20:15:20 · 393 阅读 · 0 评论 -
剑指off-求数组最大连续和
题目:求数组最大连续和,比如1,-2,3,10,-4,7,2,-5结果应该为183,10,-4,7,2分析:这和之前的数组某个值个数大于一半的处理办法是一样的,如果加上当前的值小于0了,这个是稳亏的,那么重新开始,now置0,most是用来记录曾经出现过的最大值,如果now大于most,那么most=nowint Most(int arr[],int length){原创 2015-07-20 21:25:43 · 228 阅读 · 0 评论 -
剑指off-用两个队列模拟栈
//用两个队列模拟栈//总维持一个栈有数据,另一个为空void cstack::push(int num){ if (queue2.size()!=0) { queue2.push(num); } else { queue1.push(num); } }void cstack::pop(){ if原创 2015-07-13 10:42:02 · 281 阅读 · 0 评论 -
剑指off-递归求1到n的和
//递归求1到n的和int total(int n){ if (n==1) { return 1; } return n+total(n-1);}原创 2015-07-13 16:28:31 · 499 阅读 · 0 评论 -
剑指off-统计数字二进制位有多少个1
//判断一个数字有多少位1//运用位运算,用n与1进行与运算,然后向左移动1,为什么不向右移动n,因为如果n是负数的话首位会不停补充1,造成死循环。int NumberOfOne(int n){ int count=0; int one=1; while (one!=0) { if (n & one) { count++;原创 2015-07-14 11:06:21 · 276 阅读 · 0 评论 -
剑指off-求一棵二叉树的镜像
题目:求一棵二叉树的镜像分析:后序遍历为基础,从最下面交换左右孩子//输入一个二叉树,输出它的镜像//通过后序遍历 交换left 和 right的指针void Mirror(BinaryTreeNode *pRoot){ if (pRoot==NULL) { return ; } Mirror(pRoot->left); Mirror(原创 2015-07-19 09:35:15 · 276 阅读 · 0 评论 -
剑指off-判断一棵二叉树是否包含另一棵
题目:输入二叉树A和B,判断B是不是A的子结构struct BinaryTreeNode//二叉树{ int key; BinaryTreeNode* left; BinaryTreeNode* right;};分析:应该分为两步,第一步找到相同的根节点,第二步判断是否相同,用递归的方法先写第二步二叉树和链表的递归终止条件先考虑出口NULL,还有一般性的原创 2015-07-19 09:04:35 · 285 阅读 · 0 评论 -
剑指off-成员变量初始化
成员变量初始化的顺序只与声明顺序有关。原创 2015-08-23 10:15:44 · 264 阅读 · 0 评论 -
剑指off-求两个整数的和
题目:不能用+ - X 除,求两个数的和分析:不能用10进制的运算符,就用二进制运算符,分三步,第一步不考虑进位,0与0 是0 1与1是0 0,1 1,0都是1 这和异或的运算符运算结果相同。第二步考虑进位,只有当都是11的时候才进位,其他都是0,相当于 先做与运算再向左移。第三步,前面两个结果相加。int add(int num1,int num2){ int sum=0,ca原创 2015-08-22 23:22:20 · 261 阅读 · 0 评论 -
剑指off-求1到n的代数和
题目:求1到n的代数和,不能使用if else while for switch case分析:这个东西要用迭代来控制,应该是循环或者是递归,但是循环的or 和 while都不给用,递归只要也需要if来控制结束。第一种方法是利用,类的静态成员变量被类的所有实例共有class Temp{public: Temp(){++N;Sum+=N;} static int g原创 2015-08-22 16:52:08 · 291 阅读 · 0 评论 -
剑指off-约瑟夫环
暂停原创 2015-08-22 15:30:21 · 282 阅读 · 0 评论 -
剑指off-判断5张牌是否是顺子
题目:判断五张牌是否是顺子,大小王算0分析:统计0的个数,统计空格数,比较0的个数和空格数的大小//xin//判断是不是顺子// 首先排序//计算0个数,计算坑的个数。bool isContinue(int *number){ int zeronumber=0; int blanknumber=0; sort(number,number+5); //sor原创 2015-08-21 16:01:04 · 586 阅读 · 0 评论 -
剑指off-求两个数和为s在排序序列中
题目:在一个排序序列中,输入和s,求序列中的两个数,满足两个数的和为s分析:这是一个排序序列,这一点要利用起来。设置两个指针head ,area如果head+area=s break如果head+area>s area--; head+area原创 2015-07-21 17:18:04 · 284 阅读 · 0 评论 -
剑指off-判断一棵树是否是平衡二叉树
题目:判断二叉树是不是平衡二叉树分析:平衡二叉树的特点是,左右子树的深度不超过1,那么根据之前求树的深度进行扩展int finddeepth(BinaryTreeNode* root){ if (root==NULL) { return 0; } int deepleft =finddeepth(root->left); int deepr原创 2015-07-21 16:49:31 · 307 阅读 · 0 评论 -
剑指off-求二叉树高
题目:求二叉树高分析:得到左子树高,得到右子树高,比较一下谁大,+1 返回int finddeepth(BinaryTreeNode* root){ if (root==NULL) { return 0; } int deepleft =finddeepth(root->left); int deepright=finddeepth(roo原创 2015-07-21 16:15:43 · 287 阅读 · 0 评论 -
剑指off-求第n个丑数
题目:只包含2,3,5的数字是丑数,1是第一个丑数,求第n个丑数分析:虽然有高端算法,但是估计再出一个这样的题我一下也做不出来,还是用最简单的方法,挨个判断把int ugly(int number){ int uglynumber=1; int count=0; while (1) { int uglycoy=uglynumber;原创 2015-07-21 14:13:04 · 298 阅读 · 0 评论 -
剑指off-第一个只出现一次的字符
题目:在字符串中找到第一个只出现一次的字符, abaccdeff 输出b分析:可以用哈希表,统计技术,然后顺序遍历哈希表,输出第一个值为1的字符。访问的值是字符,一共只有256个字符,用一个数组来实现哈希表int findonce(char str[]){ int result=0; int* hashmap=new int[256]; for (原创 2015-07-21 14:40:30 · 316 阅读 · 0 评论 -
剑指off-找到最小k个数字
题目:n个数的数组,找到最小的k个数字分析:可以使用排序然后取前K个数字,也可以维护一个k大小的set,set的存储是有序的,当set不满k个时候就入set,如果set达到k就与set中最大值比较,如果比最大值还大,那么继续,如果比最大值小那么替换最大值。set是用红黑树实现的。void FindMinK(int arr[],int length,int k){ set mink原创 2015-07-20 20:27:45 · 361 阅读 · 0 评论 -
剑指off-复制复杂链表
题目:链表的结构中多了一个spring指针,这个指针可能指向链表中的任何一个节点,复制这个复杂链表。分析:首先想到的是第一种方法,复制next串联起来的链表,然后复制spring 指针,但是每次都要从头顺序查找spring指针在副本中的值,那么这个效率应该是O(n^2)第二种方法是将副本建立在原来的链表中,在每一个原node后面新建我们的node,因为这还算一个链表,那么在复制spring原创 2015-07-20 17:01:37 · 331 阅读 · 0 评论 -
剑指off-判断一个数组是不是搜索二叉树的后序遍历的序列
题目:判断一个数组是不是搜索二叉树的后序遍历的序列,假设每个值都不一样分析:搜索二叉树有一个特性,左都比根小,右都比根大,那么后序遍历的最后一个数字式根节点,其余部分为两方面,一部分比它小,一部分比它大,其中最重要的每部分最后一个都是根节点,所以采用递归的方式。bool HR(int seque[],int length)//HR 后入 噗{ if (seque==NULL ||原创 2015-07-19 19:17:15 · 328 阅读 · 0 评论 -
剑指off-打印字符串全排列
题目:打印字符串全排列分析:递归实现,两步,第一步首位pbegin与数组中的其他值交换,第二步,在交换的基础上,也就是固定了首位,将余下的部分重复第一步,其实有第三步就是换回来void Permutation(char* pStr, char* pBegin){ if (*pBegin=='\0') { printf("%s \n",pStr);原创 2015-07-20 19:54:15 · 244 阅读 · 0 评论 -
剑指off-求链表终点节点
题目:如果链表个数为奇数,返回中间节点,如果为偶数,然后两个中的任意一个。思路:维护两个指针,一个指针的速度是另一个的两倍。相关题目:判断链表是否有环思路:维护两个指针,一个指针的速度是另一个的两倍。如果前一个快速指针追上了后一个慢速指针,证明有环。原创 2015-07-15 20:40:09 · 277 阅读 · 0 评论 -
剑指off-反转链表
题目:反转链表,返回反转后链表的指针防止在反转时候链表断裂,要有三个指针,当前,next,preListNode* reverseList(ListNode* pHead){ ListNode* head=pHead; ListNode* next=NULL; ListNode* pre=NULL; while (head!= NULL) {原创 2015-07-18 21:39:17 · 288 阅读 · 0 评论 -
剑指off-归并两个有序链表
题目:归并两个有序链表分析:之前的归并排序使用的是额外的存储和哨兵,数据结构是数组,要达到归并效果,现在这种方法是不使用额外的存储,数据结构是链表。一个简单的流程是如下图,可以看成递归形式,终点是指针为NULLListNode* MergeList(ListNode* pHead1,ListNode* pHead2){ ListNode* merge=NULL;原创 2015-07-18 22:14:43 · 406 阅读 · 1 评论 -
剑指off-打印1到n
//题目:输出 1到n。焦点在于如果n很大,超过32位或者64位,这基本上无法表示//解决的办法是用字符串模拟加法,但是如何模拟,如何控制循环呢?//memset(char* number,int ch,int n);作用将number前n个位置用ascII码代替memset(a,0,sizeof(a))//用memset给每一个位赋值为ASCII'0'//strlen(s)不包括'\0'原创 2015-07-15 19:21:26 · 226 阅读 · 0 评论