![](https://img-blog.csdnimg.cn/20201014180756754.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构
喝咖啡影响睡眠
这个作者很懒,什么都没留下…
展开
-
检验入栈序列、出栈序列是否合法
检验入栈序列、出栈序列是否合法原创 2017-07-23 00:19:52 · 837 阅读 · 0 评论 -
二进制中1的个数
题目:计算一个整数二进制位中1的个数。要求效率尽可能的高。且能正确求正数和负数的二进制中1的个数。可能首先想到的是用这个数&1,然后每次右移一位。这样有一个致命的问题就是,计算负数时,因为右移最高位会补1,最后会变成0xFFFFFFFF陷入死循环。而且即使是正数,效率也不是很高。要解决这个问题,可以不移动参数,而移动1,即每次让1左移一位,判断当前位置是否为1,但是效率同样很低,为原创 2017-07-23 01:22:20 · 253 阅读 · 0 评论 -
求N!末尾0的个数
题目:给定一个整数N,那么N的阶乘N!末尾有多少个0呢?例如:N=10,N!=3 628 800,N!的末尾有两个0。方法一:最容易想到的方法,先把N的阶乘求出来,再用一个函数计算末尾0的个数,但是这个方法有两个问题:当数字很大时,效率很差、用内置类型(int、long等)会溢出。要解决这两个问题,只能优化算法。首先要知道N的阶乘一定可以用K×10M来表示,那我们的问题就变成了原创 2017-07-23 13:54:19 · 1875 阅读 · 0 评论 -
求二叉树叶子节点的个数/求二叉树第k层的节点个数。
题目:求二叉树叶子节点的个数/求二叉树第k层的节点个数。这两个题的方法是一样的,用递归就可以求解1.叶子节点:1)当前节点为NULL,返回02)没有左右孩子,返回13)否则返回左孩子的叶子节点个数加上右孩子的叶子节点个数size_t BinaryTree::_GetLeefNode(Node* pRoot){ if (NULL == pRoot) return 0;原创 2017-07-23 19:43:24 · 1102 阅读 · 0 评论 -
求数组中出现次数超过一半的数字
题目:一个数组中有一个数字的次数超过了数组的一半,求出这个字符。如:int a[]={2,3,2,2,2,2,2,5,4,1,2,3},求出超过一半的数字是2 由题目可知,这个数字出现的次数,比其他所有数字出现次数之和还要大,所以在遍历时可以保存两个值,一个是里面的数字,一个是出现的次数。情况:1)如果下一个数字和保存的数字相同,次数加12)如果下一个数字和保存的数字不原创 2017-07-23 23:15:06 · 363 阅读 · 0 评论 -
链表逆置
题目:给出一个链表和一个数k,比如链表1→2→3→4→5→6,逆置后6→5→4→3→2→1分析:因为单链表只能找到next节点,不能找到prev节点,所以必须借助辅助指针来保存原来链表的状态。我们可以把过程分成下面几步:1)pNext 保存 pHead->next 2)pHead->next 指向 pPre 3)pPre 指向 pHead保存原来的上一个节点 4)原创 2017-07-25 11:18:50 · 2897 阅读 · 0 评论 -
链表翻转(按K个一组)
题目:链表翻转。给出一个链表和一个数k,比如链表1→2→3→4→5→6,k=2,翻转后2→1→4→3→6→5,若k=3,翻转后3→2→1→6→5→4,若k=4,翻转后4→3→2→1→5→6分析:这个题是链表逆置的升级版。重点是,把整个链表按照每K个一组分成若干组。递归翻转,先翻转最后一组,依次向前翻转。不好理解的地方在于,每一组翻转后怎么衔接。其实跳出递归后,表示后面的节点已经原创 2017-07-25 13:03:43 · 3523 阅读 · 1 评论