算法专栏
常见算法汇总
robbie.yang
这个作者很懒,什么都没留下…
展开
-
有限状态自动机的应用场景 (javascript)
有限状态自动机的应用场景状态机是有限状态自动机的简称。是用来描述事物有限个状态之间,相互切换的数学模型。state: 状态,一个状态机至少有两个状态event: 事件,执行某个操作的触发条件action: 动作,表示事件执行后,即将执行动作transtion: 变换,状态之间的相互切换思考: 抽奖组件,如何可以抽象成一个状态机。状态start (未抽奖时,正常滚动)ongoing_run_scroll (抽奖进行中,转盘快速滚动)ongoing_stop_scroll (抽原创 2020-11-21 16:03:15 · 1813 阅读 · 0 评论 -
图解排序算法-快速排序 (Javascarpt 实现)
快速排序核心思想: 选取一个基数,保证左边的数都小于这个基数,右边的数都大于这个基数。然后递归执行上述步骤时间复杂度 O(nlgn~n^2)最好情况O(nlgn):在数组中,每次选取的基数都恰好是最数组的 n/2 的位置。如下图:递归的总次数就等于二叉树的层数( k )每一层的节点数等于 2^(k-1)二叉树的总节点数等于: Sn=1+2+4+...+2^(k-1)...原创 2019-03-30 13:20:35 · 335 阅读 · 0 评论 -
图解排序算法-冒泡排序 (Javascarpt 实现)
冒泡算法“冒泡”的由来按照气泡在水中上浮的顺序进行模拟的一种算法,一般较大的气泡上浮越快,较小的气泡则在其后。核心思路:在数组遍历时,当遇到较大的数值时,将较大的数往后交换,直至本轮比较结束。然后进行下一趟比较。时间复杂度 O(n^2)遍历一趟需要的时间复杂度为 O(n),一共需要进行 n-1.因此,总的时间复杂度为 O(n^2).源码实现:let arr = [20, 40,...原创 2019-03-30 11:16:58 · 314 阅读 · 0 评论 -
算法:两数之和求下标(递归解法)
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。示例:给定 nums = [2, 7, 11, 15], target = 9因为 nums[0] + nums[1] = 2 + 7 = 9所以返回 [0, 1]递归解法:...原创 2019-03-16 10:31:26 · 786 阅读 · 0 评论 -
蓝桥杯 三羊献瑞(重新排版)
问题描述: 观察下面的加法算式: 祥 瑞 生 辉 + 三 羊 献 瑞 ________________ 三 羊 生 瑞 气 其中,相同的汉字代表相同的数字,不同的汉字代表不同的数字。 请你填写“三羊献瑞”所代表的4位数字(答案唯一),不要填写任何多余内容。最终结果: 9567+1085=10652解法一(快速方法):原创 2018-02-07 17:49:51 · 570 阅读 · 2 评论 -
蓝桥杯 三羊献瑞
本文已经修改,重新排版:下面是文章的新链接点击打开链接问题描述:观察下面的加法算式: 祥 瑞 生 辉 + 三 羊 献 瑞------------------- 三 羊 生 瑞 气其中,相同的汉字代表相同的数字,不同的汉字代表不同的数字。请你填写“三羊献瑞”所代表的4位数字(答案唯一),不要填原创 2016-03-11 17:48:59 · 2823 阅读 · 3 评论 -
快速统计二进制中1的个数(分析篇)
今天做了一道题,发现n&=(n-1)这个式子很好奇,然后试着算了一遍发现它竟然能够快速统计二进制1的个数,特此拿来分享一下。首先,分析一下该式子,先可以简化为n=n&(n-1);我们先做一个实例,n12345678十进制12345678二进制000100100原创 2016-08-16 15:12:46 · 13295 阅读 · 2 评论 -
常用排序算法之希尔排序
一、简介希尔排序也是一直插入排序。直接插入排序类似于扑克牌的插牌顺序,而希尔排序是通过下标间距相同的数进行分组排序,直至整体有序排序完毕。二、排序步骤原始数组:a[8]={5,3,8,2,4,1,7,6}; length=8第一趟 默认间距gap = 4 (length/2) 分为四组: 一. 5 4 二. 3原创 2016-05-25 18:33:24 · 425 阅读 · 0 评论 -
常用排序算法之选择排序
1.简介选择排序,即有选择性地进行排序。而这个选择的标准就是"每次遍历寻找值最小的数"。2.选择排序的种类分为两类:一类是简单选择排序,另一种是树形选择排序(堆排序)--这个排序会另写一篇。3.排序过程4.算法关键每趟查询后的结果,将原数组分为已排序数组和待排序数组;每次查找的最小值只与待排序数组的原创 2016-05-24 15:56:28 · 338 阅读 · 0 评论 -
常用排序算法之冒泡排序 (C、Javascript实现)
1.“冒泡”的由来按照气泡在水中上浮的顺序进行模拟的一种算法,一般较大的气泡上浮越快,较小的气泡则在其后。(介是由于浮力,别问我为什么\(^o^)/~)2.基本思想每次比较两个相邻的元素,如果按照从大到小的顺序依次排序,一旦他们出现错误顺序,则将其相互置换。3.算法流程(未优化)假设有3个元素3,1,2,将这3个数按大到小的顺序进行排序,也就是说越往后的数越小...原创 2016-04-23 20:37:54 · 421 阅读 · 0 评论 -
常用排序算法之快速排序
1.何为“快排”? 快速排序,即就是很快速,很便捷的一种排序嘛-!O(∩_∩)O~ 但是,快速排序也并非一定是快速的。如果按照最糟糕的情况来看,它的时间复杂度几乎和冒泡排序是相同的0(n2)(是什么情况呢?)。但是,平均时间复杂度是0(NlogN)。2.基本思想 快速排序是基于一种“二分”的思想。 它将在一组无序数中,寻找一个基准数,该数将原数组一分为二,左边...原创 2016-04-24 23:25:59 · 387 阅读 · 0 评论 -
常用排序算法之插入排序
插入排序,常用排序算法之插入排序,排序算法原创 2016-04-26 17:34:45 · 653 阅读 · 0 评论 -
专题:链表结点的删除
1.数据域的值不重复linkList* delNode(linkList *h,int key){//通过关键字去删除节点 linkList *p,*q; for(p=h;p&&p->data!=key;q=p,p=p->next);//空循环 if(p==NULL){ printf("没找到"); }else if(p==h){ h=h->next;原创 2016-05-23 16:46:32 · 375 阅读 · 0 评论 -
专题:单向链表
1.统计单向链表结点的个数//统计链表结点个数int count(linkList* head){//获取头结点 int num=0; linkList *p; for(p=head;p!=NULL;p=p->next){//当p->next域为空时,停止遍历 num++; } return num;} 2.统计数据域值为奇数的节点//统计数据域值为奇数的节点原创 2016-05-23 16:06:54 · 426 阅读 · 0 评论 -
正向创建单向链表
正向创建链表,即采用”尾插法“。数据集合:102030405060目标:按数组的值,单向正向创建一个链表。主要算法,1.创建头结点2.创建其他节点分析结构1.链表数据结构typedef struct Node{ int data;//数据域 struct Node *next;/原创 2016-05-23 14:52:15 · 3208 阅读 · 0 评论 -
折半求和(递归调用)
递归求解:数组中的所有数值之和。原创 2016-04-13 18:11:06 · 1320 阅读 · 0 评论 -
蓝桥杯 曼哈顿距离
X星球居民小区的楼房全是一样的,并且按矩阵样式排列。其楼房的编号为1,2,3...当排满一行时,从下一行相邻的楼往反方向排号。我们的问题是:已知了两个楼号m和n,需要求出它们之间的最短移动距离(不能斜线方向移动)输入为3个整数w m n,空格分开,都在1到10000范围内w为排号宽度,m,n为待计算的楼号。要求输出一个整数,表示m n 两楼间最短移动距离。比如:当小区排原创 2016-03-17 20:02:39 · 648 阅读 · 0 评论 -
蓝桥杯 带分数
问题描述100 可以表示为带分数的形式:100 = 3 + 69258 / 714。还可以表示为:100 = 82 + 3546 / 197。注意特征:带分数中,数字1~9分别出现且只出现一次(不包含0)。类似这样的带分数,100 有 11 种表示法。输入格式从标准输入读入一个正整数N (N输出格式程序输出该数字用数码1~9不重复不遗漏地组成带分原创 2016-03-16 17:17:36 · 797 阅读 · 0 评论 -
加号改乘号 (穷举法)
题目大意 把1+2+3+…+48+49中的两个加号改成乘号(修改位置不能相邻),使得式子的结果由1225变为2015。比如: 1+2+3+...+10*11+12+...+27*28+29+...+49 = 2015 就是符合要求的答案。 请你寻找另外一个可能的答案, 并把位置靠前的那个乘号左边的数字提交(对于示例,就是提交10)。 注意:需要你提交的是一个整数,不要填写任何多原创 2016-03-14 17:37:30 · 1526 阅读 · 0 评论 -
蓝桥杯 欧拉和鸡蛋
问题描述:大数学家欧拉在集市上遇到了本村的两个农妇,每人跨着个空篮子。她们和欧拉打招呼说两人刚刚卖完了所有的鸡蛋。欧拉随便问:“卖了多少鸡蛋呢?”不料一个说:“我们两人自己卖自己的,一共卖了150个鸡蛋,虽然我们卖的鸡蛋有多有少,但刚好得了同样的钱数。你猜猜看!”欧拉猜不出。另一个补充道:“如果我按她那样的价格卖,可以得到32元;如果她按我的价格卖,可以得到24.5元”。原创 2016-03-09 16:29:52 · 626 阅读 · 0 评论 -
蓝桥杯 《第39级台阶》
小明刚刚看完电影《第39级台阶》,离开电影院的时候,他数了数礼堂前的台阶数,恰好是39级!站在台阶前,他突然又想着一个问题:(奇葩的想法...) 如果我每一步只能迈上1个或2个台阶。先迈左脚,然后左右交替,最后一步是迈右脚,也就是说一共要走偶数步。那么,上完39级台阶,有多少种不同的上法呢? 请你利用计算机的优势,帮助小明寻找答案。要求提交的是一个整数。注意:不要提交解原创 2016-03-08 16:53:11 · 1003 阅读 · 0 评论 -
蓝桥杯 奖券数目
问题描述:有些人很迷信数字,比如带“4”的数字,认为和“死”谐音,就觉得不吉利。虽然这些说法纯属无稽之谈,但有时还要迎合大众的需求。某抽奖活动的奖券号码是5位数(10000-99999),要求其中不要出现带“4”的号码,主办单位请你计算一下,如果任何两张奖券不重号,最多可发出奖券多少张。请提交该数字(一个整数),不要写任何多余的内容或说明性文字。原创 2016-03-07 17:35:47 · 1485 阅读 · 3 评论 -
古堡算式
福尔摩斯到某古堡探险看到门上写着一个奇怪的算式: ABCDE * ? = EDCBA他对华生说:“ABCDE应该代表不同的数字,问号也代表某个数字!”华生:“我猜也是!”于是,两人沉默了好久,还是没有算出合适的结果来。请你利用计算机的优势,找到破解的答案。把 ABCDE 所代表的数字写出来。答案写在“解答.txt”中,不要写在这里!原创 2016-03-06 21:53:59 · 949 阅读 · 0 评论 -
蓝桥杯 大数乘法
【结果填空】 (满分10分)对于32位字长的机器,大约超过20亿,用int类型就无法表示了,我们可以选择int64类型,但无论怎样扩展,固定的整数类型总是有表达的极限!如果对超级大整数进行精确运算呢?一个简单的办法是:仅仅使用现有类型,但是把大整数的运算化解为若干小整数的运算,即所谓:“分块法”。 如图【1.jpg】 表示了分块乘法的原理。可以把大数分成原创 2016-03-04 16:51:18 · 960 阅读 · 0 评论 -
蓝桥杯 星期几
【结果填空】 (满分5分) 1949年的国庆节(10月1日)是星期六。 今年(2012)的国庆节是星期一。 那么,从建国到现在,有几次国庆节正好是星期日呢?只要答案,不限手段! 可以用windows日历,windows计算器,Excel公式,。。。。。 当然,也可以编程!不要求写出具体是哪些年,只要一个数目! 千万不要提交源代码! 答案不要写在这里,写在“解答.txt”中原创 2016-03-03 18:43:59 · 808 阅读 · 0 评论 -
高斯日记
大数学家高斯有个好习惯:无论如何都要记日记。 他的日记有个与众不同的地方,他从不注明年月日,而是用一个整数代替,比如:4210 后来人们知道,那个整数就是日期,它表示那一天是高斯出生后的第几天。这或许也是个好习惯,它时时刻刻提醒着主人:日子又过去一天,还有多少时光可以用于浪费呢?高斯出生于:1777年4月30日。 在高斯发现的一个重要定理的日记上标注着:5343,因此可算出那天是:1791原创 2016-03-02 18:31:09 · 633 阅读 · 0 评论 -
基础训练 龟兔赛跑预测
问题描述龟兔赛跑预测 话说这个世界上有各种各样的兔子和乌龟,但是研究发现,所有的兔子和乌龟都有一个共同的特点——喜欢赛跑。于是世界上各个角落都不断在发生着乌龟和兔子的比赛,小华对此很感兴趣,于是决定研究不同兔子和乌龟的赛跑。他发现,兔子虽然跑比乌龟快,但它们有众所周知的毛病——骄傲且懒惰,于是在与乌龟的比赛中,一旦任一秒结束后兔子发现自己领先t米或以上,它们就会停下来休息s秒。对于不同的兔子,t,s原创 2016-02-17 11:46:49 · 596 阅读 · 0 评论 -
基础练习 FJ的字符串(递归)
问题描述 FJ在沙盘上写了这样一些字符串: A1 = “A” A2 = “ABA” A3 = “ABACABA” A4 = “ABACABADABACABA” … … 你能找出其中的规律并写所有的数列AN吗?输入格式 仅有一个数:N ≤ 26。输出格式 请输出相应的字符串AN,以一个换行符结束。输出中不得含有多余的空原创 2016-02-17 15:21:53 · 1371 阅读 · 0 评论 -
递归练习-字母输出
样例输出:AABAABCBAABCDCBA#include int fun(int n){ if(n==1){ printf("A"); } else{ fun(n-1); printf("%c",'A'+n-1); } //fun(n-1);}int fun2(int n){ if(n==1){ printf("A"); }原创 2016-02-17 15:18:11 · 909 阅读 · 0 评论 -
基础训练 芯片测试
问题描述 有n(2≤n≤20)块芯片,有好有坏,已知好芯片比坏芯片多。 每个芯片都能用来测试其他芯片。用好芯片测试其他芯片时,能正确给出被测试芯片是好还是坏。而用坏芯片测试其他芯片时,会随机给出好或是坏的测试结果(即此结果与被测试芯片实际的好坏无关)。 给出所有芯片的测试结果,问哪些芯片是好芯片。输入格式 输入数据第一行为一个整数n,表示芯片个数。 第原创 2016-02-17 12:47:34 · 838 阅读 · 0 评论 -
基础练习 Huffuman树(贪心算法)
问题描述 Huffman树在编码中有着广泛的应用。在这里,我们只关心Huffman树的构造过程。 给出一列数{pi}={p0, p1, …, pn-1},用这列数构造Huffman树的过程如下: 1. 找到{pi}中最小的两个数,设为pa和pb,将pa和pb从{pi}中删除掉,然后将它们的和加入到{pi}中。这个过程的费用记为pa +pb。 2. 重复步骤1,直到{原创 2016-01-23 17:01:28 · 3104 阅读 · 3 评论 -
高精度加法(简明版C语言)
解题思路:根据竖式加法的规则,从个位依次向高位进行相加。例如: 2 3+ 7------------------------------------ 2 (1)0其中,()内为进位数原创 2016-01-22 18:42:31 · 2691 阅读 · 0 评论