算法
文章平均质量分 55
bxw1992
这个作者很懒,什么都没留下…
展开
-
人员签到程序
学院经常要统计人员在校信息,这是最为麻烦的事情,因为总会有个别同学看不到。所以当信息收集起来后,要联系这些人,确认情况。但是首先要把他们找出来,从50多个人里面找出哪些同学没有回复真的好麻烦,要一个一个去对应名单,然后标记,浪费时间。今晚有一次统计这样的信息,想着以后这样的情况还多着呢,所以就编了一个简单的程序,用来查找那些“隐匿”的同学。原创 2017-05-17 21:42:39 · 1234 阅读 · 0 评论 -
KMP算法
具体知识参考:http://blog.csdn.net/v_july_v/article/details/70418271、计算模式的next数组2、使用next辅助进行匹配#include #include#includeusing namespace std;vector GetNext(string &p){ int len = p.size(); vector原创 2017-08-21 16:08:43 · 162 阅读 · 0 评论 -
翻转单链表
单链表的翻转是一道很基本的算法题。 方法1:将单链表储存为数组,然后按照数组的索引逆序进行反转。 方法2:使用三个指针遍历单链表,逐个链接点进行反转。 方法3:从第2个节点到第N个节点,依次逐节点插入到第1个节点(head节点)之后,最后将第一个节点挪到新表的表尾。方法2:有3个指针,当前待处理节点的指针cur,因为cur要指向前一节点,原创 2017-08-14 17:34:32 · 168 阅读 · 0 评论 -
25匹马问题
题目:如果要25匹马中选出跑得最快的3匹,每次只有5匹马同时跑,最少要比赛几次,才能确保得出结果?25匹马看成25个点,每次比赛在参赛的5匹马之间引入4条有向边,1->2->3->4->5,数字表示参赛马的成绩排名。这样最后能形成一个有向无环图, 我们需要得到的是前三名的节点a, b, c, 其中a->b->c, 并且c是剩余节点的祖先。六次比赛(分5组各自比赛,之后后每组的第一名比赛)之后,转载 2017-08-27 20:18:36 · 1573 阅读 · 0 评论 -
几道滴滴笔试智力题思考
2.AB轮流在桌子上放硬币,规则是不能互相覆盖,谁最后没有地方放为输,则:A.后放者有必胜的策略 B.先放者有必胜的策略 C.两者都没有必胜的策略思路:一般题目对桌子的形状有描述,必须具有中心对称结构。答案是先放者有必胜策略。首先,先放者在桌子正中心放第一枚硬币,然后,无论对方在哪里放硬币,先手的人总可以找到一个与之对应的位置。所以先手肯定赢。类似题目:每个人每原创 2017-08-27 21:44:22 · 3131 阅读 · 0 评论 -
归并排序
思路:1、首先进行分割,直至每块大小为1(必须达到1,因为归并时,是归并两块,1才是最初始的块有序状态)2、然后进行归并3、将辅助排序的数组设置为静态的归并函数思路:1、将待归并的区间备份到辅助数组2、索引从low~hi3、如果 i>mid,说明low~mid已经处理完成4、如果 j>hi,说明mid+1~hi已经完成5、正常比较处理6、注意对i和j的更新原创 2017-09-05 13:29:25 · 192 阅读 · 0 评论 -
求一个数组中右边第一个比他大的数(单调栈)
思路:这个问题,从直觉上来讲,应当是一遍遍历,便可以解决问题。这类问题的特点是,一部分要详尽保留信息,另一部分呈现未解决问题的积累特性。具体到这个问题,创建一个数据结构保留未解决的子问题,根据特点选择栈。1、栈里面保留是索引,而非元素,其实这是一个很关键的地方,索引的信息要比内容多,因为可以索引本身就可以确定内容。要牢记这一特点2、初始栈,里面为第一个元素3、如果栈不为空,而且原创 2017-09-05 21:29:29 · 8530 阅读 · 1 评论 -
链表的各种题目整理
链表的各种题目整理(C语言实现)(Simple and Brief) 最后更新于Date:2012-11-04这里处理的全部是单链表:typedef struct node { char *data; struct node *next; } node_t;我们约定一个打印链表的函数:void list_display(node_t *head){转载 2017-08-24 10:03:22 · 412 阅读 · 0 评论 -
连续投出两枚硬币的平均次数
假设有一个硬币,抛出字(背面)和花(正面)的概率都是0.5,而且每次抛硬币与前次结果无关。现在做一个游戏,连续地抛这个硬币,直到连续出现两次字为止,问平均要抛多少次才能结束游戏?注意,一旦连续抛出两个“字”向上游戏就结束了,不用继续抛。首先抛一枚硬币,如果是花,则需要重新开始,这件事发生的概率为0.5;如果是字,那么再抛一次硬币,如果是花,则需要重新开始,这件事发生的概率为0.5*0.转载 2017-08-24 12:51:14 · 1228 阅读 · 0 评论 -
01背包问题
有编号分别为a,b,c,d,e的五件物品,它们的重量分别是2,2,6,5,4,它们的价值分别是6,3,5,4,6,现在给你个承重为10的背包,如何让背包里装入的物品具有最大的价值总和?#include#includeusing namespace std;int max(int a, int b){ return a > b ? a : b;}/*二维数组方式*//*原创 2017-08-31 13:51:25 · 343 阅读 · 0 评论 -
单链表的快排实现
题目:对单链表,实现快速排序思路(升序):快速排序的主要操作是用选取的枢轴作为切割的基准,左侧所有元素均小于枢轴,右侧均不小于枢轴。经典实现是从头和尾两个方向进行处理,由于单链表的移动方向是单向的,所以必须寻求其他方式。用一个指针遍历链表,遇到小于枢轴的元素,就将其移到链表的开始处,剩下的就是不小于枢轴的元素;为了实现上述目标,建立两个指针,一个指针指向所有元素都小于枢轴的子链表,一个指针原创 2017-08-14 10:19:01 · 6481 阅读 · 0 评论 -
球盒问题
(公式没有贴出来,具体参见https://wenku.baidu.com/view/1828a509336c1eb91a375da3.html)一、球相同,盒子相同,且盒子不能空 例1.8个相同的球放入3个相同的盒子中,每个盒子中至少有一个. 问有多少种不同的放法?解析 球入盒问题,可以看成分两步完成,首先是将8个球分成三堆,每堆至少一个. 由于这里球和盒子都相同,每三堆放入3转载 2017-09-01 21:00:45 · 1953 阅读 · 0 评论 -
取最后一个球
2009个球,两人轮流取球,每人每次至少取2个最多5个,取到最后一个输,如果甲先取,谁将获胜?2009个球,两人轮流取球,每人每次至少取2个最多5个,取到最后一个赢,如果甲先取,甲应当怎样取?思路:谁先取,随占据优势。以甲先取为例,除却第一次,中间步骤的执行过程是 乙->甲,重复执行;甲在中间过程的执行策略就是,无论乙取几个,甲将总数凑够7个(2+5)。在保证执行中间步骤原创 2017-08-14 15:02:23 · 830 阅读 · 0 评论 -
寻找重复积分
一千万游戏玩家,有一个积分排行榜, 积分范围在0-99999,找到重复的积分; 考虑内存不足,空间复杂度尽量低;如果内存充足怎么做?1、节约空间的方法,原地排序(O(nlgn+n)),遍历,通过判断与相邻元素是否相等,判断重复。空间复杂度O(1)。2、节约时间方案,建立100000大小数组,计算积分值出现次数,时间复杂度O(n),空间复杂度O(100000),与数据量无关,与积分浮原创 2017-08-14 14:30:32 · 371 阅读 · 2 评论 -
求取单链表的中间值
题目:找出单链表的中间值,朴素的想法是先遍历链表计算出链表总长度,再找中间节点,此方法效率太低。思路:创建两个指针,一个指针pslow每次往后移动1个位置,另一个pquick移动两个位置,当pquick移动到最后一个元素时,pslow指向的元素就是中间位置。注意:1、判断什么时候结束,很重要,pquick移动到最后一个元素就结束了,判断是否是最后一个元素,是通过pquick->next原创 2017-08-14 13:53:51 · 3398 阅读 · 1 评论 -
稳定排序和不稳定排序
这几天笔试了好几次了,连续碰到一个关于常见排序算法稳定性判别的问题,往往还是多选,对于我以及和我一样拿不准的同学可不是一个能轻易下结论的题目,当然如果你笔试之前已经记住了数据结构书上哪些是稳定的,哪些不是稳定的,做起来应该可以轻松搞定。本文是针对老是记不住这个或者想真正明白到底为什么是稳定或者不稳定的人准备的。 首先,排序算法的稳定性大家应该都知道,通俗地讲就是能保证排序前2个相等的转载 2017-07-17 23:06:58 · 141 阅读 · 0 评论 -
求范围内质数(素数)
素数定义:除了1和自身之外,不能被其他整数整除。方法1:质朴的方法,重复调用的方法是判断一个数是不是质数。当求一个数是不是质数时,这种方法是正确的,也没有优化空间,但是当求一个区间内的质数时,可以进行优化。方法2:方法1存在的问题是,没有有效利用已经确定的信息,也即对后续数字判断时无法利用已经求得的信息。如若判断某一数字为质数,那么以它为因子的所有数,都不会是质数,故将其剔除。(若想换区时原创 2017-08-08 17:38:22 · 3824 阅读 · 0 评论 -
Hash表、Hash冲突
Hash表通过Hash函数将关键字映射到该记录在表中的存储位置(注意这里的存储位置只是表中的存储位置,并不是实际的物理地址,称作为Hash地址)。 由于很容易产生冲突(不同的键值,经过Hash函数计算后Hash值是一样的,无论怎么处理,在访问时,针对同一Hash值的不同关键字都会产生比较操作,所以不仅要存储Value值,还要存储key,除非有标志位记录任一哈希是否冲突,否则所有都要存储转载 2017-07-07 19:30:51 · 594 阅读 · 0 评论 -
已知栈的压入顺序,判断弹出顺序是否正确
已知栈的压入顺序,判断弹出顺序是否正确。思路:1、建立一个辅助栈2、如果栈顶元素不等于弹出元素,则按顺序将压入序列的元素压入栈,直至栈顶元素等于弹出元素。(栈为空时的特殊操作)3、弹出栈顶元素,更新弹出元素。4、重复执行2、3直至,待处理的弹出序列为空。#include#include#includeusing namespace std;bool check(c原创 2017-08-17 11:38:47 · 1039 阅读 · 0 评论 -
用位操作实现+
将加法的某一项取负,便可以实现减法。(为了避免溢出,将中间变量定义为long long,long达不到要求)用与(&)和左移(用位操作实现加法的步骤为:1、用两个数字的与和左移,判断有没有进位(非0,为有进位)。2、若有进位,将基本和、进位作为相加的两个元素回到步骤1。3、若没有进位,返回基本和#include using namespace std;int add原创 2017-08-13 18:56:42 · 234 阅读 · 0 评论 -
旋转数组的最小数字
注意点:1、升序和降序,是题目的一种特殊形式,要考虑2、要注意,元素可能重复3、特别是,a={3,3,3,0,3,3,3}这样的输入,如果a[mid]==3,无法判断是在0的左侧还是右侧,因此只能,单步缩小范围(退化为线性操作)4、不要简单地,将low或hi更新为mid,因该是mid+1,或mid-1,否则会死锁。题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组原创 2017-08-13 20:16:09 · 165 阅读 · 0 评论 -
单链表的倒数第K个节点
思路:创建两个迭代器,一个迭代器quick,一个迭代器slow,quick沿链表,先行K步,然后和slow一起行进,直至quick到达链表尾端,此时slow对应的数据,就是倒数第K个节点。#include #include#includeusing namespace std;list change(vector &a){ list list; for (int i = 0;原创 2017-08-13 22:12:11 · 291 阅读 · 0 评论 -
全排列(二)字典序方式与next_permutation的联系
STL中algorithm算法里面的next_permutation方法便是通过字典序方式实现的。原创 2017-05-16 20:01:24 · 306 阅读 · 0 评论 -
全排列(一)next_permutation方式实现
一、next_permutation方式实现1、next_permutation函数简介(1) 原理:每个序列都对应一个数值(并非原理,只是一种理解方式,也可以当做是一个序列与数值的映射关系,数值范围取决于参与排列元素的个数,记住这种思路)(此种理解方式的原文链接:http://www.cppblog.com/yindf/archive/2010/02/24/108312.html原创 2017-05-16 10:54:21 · 450 阅读 · 1 评论 -
快速排序
快速排序最为重要的操作是切分(partition),以升序为例,切分操作实现的方法是,根据待排序列中的一个选定值(该值的选取有很多种方法,当然也可以随便选取,选择的不同方式并不会影响算法的功能,只是会影响算法的平均速度),将待排序列中小于选定值的值放在选定值的左侧,大于选定值的值放在右侧。原创 2017-05-19 10:10:35 · 328 阅读 · 0 评论 -
最大连续子序列和
题目:一个有N个整数元素的一维数组(A[0], A[1], …. A[N-2], A[N-1]),请问数组中的子数组之和的最大值是什么(子数组必须是连续的)?例: A=[-2 ,5 ,3 ,-6 ,4 ,-8 ,6]中的最大子数组之和为8(其中5+3=8)。思路:动态规划,1、用一个数组记录以原始数组任一元素为结尾的子序列的最大和。2、初始时,记录数组中的内容为原始数组中数原创 2017-08-14 11:25:04 · 304 阅读 · 0 评论 -
LRU Cache
思路:题目要求查找和插入操作都是O(1)的复杂度,所以要针对这个要求,设计合适的数据结构1、题目要求最近使用的,放到最前面,因此get()会触发位置调整的操作,针对这一需求,比较合适的数据结构是双向链表,这里有一个小技巧,当需要将链表中某项移到最前面时,可以先删除,再重新在前面插入相应数据,而不是将其移动到最前面。2、get和put都会涉及查询操作,如果所有的数据都以list存储,那么查询原创 2017-10-26 19:53:03 · 262 阅读 · 0 评论