算法学习
这是我的算法学习总结,其中很多文章有助于在校学生思考和借鉴
seen_in_hw
希望我能变厉害!!!成为大师!!!我放弃了很多看似很炫的技术而去探寻技术的本质,技术是用来提供服务的,所有的技术都离不开思想,而思想是最难掌握的,我们应该把更多的精力放在对于思想的探寻上
展开
-
经典算法:计算两个日期之间的天数
如题所示,这个算法就是写起来麻烦一点,不过还是很简单的,思路清晰就非常好做思路:用两套数组分别存储每个月的天数,分别是闰年和非闰年,分别为num1[] 和 num2[]; **然后就是先计算年和年之间的差距{ 相距一年:为第一年的剩下日子+第二年开始的日子 相距一年以上:为初始年的剩下日子+末尾年开始原创 2015-09-05 02:36:21 · 9000 阅读 · 0 评论 -
经典算法:X进制数转换为Y进制数
前言 我们先看一个代码例子,这是十进制数转换为任意进制数的方法 void ARY(int num,int N){ int reminder; if(num<N){cout<<num;return ;} reminder = num%N; ARY(num/N,N); //通过递归方法来输出 cout<<reminder;}如果对此段代码不明白,请参照我原创 2015-09-07 13:26:10 · 1828 阅读 · 0 评论 -
【经典算法】:求一个数的因子数
问题分析如:整数 4,有1, 4, 2 共3个因子。现在就是输入一个数num,求其因子数。方法:判断数,如果数不为1,则其因子数起码有两个,(自身和1)然后从i=2开始到sqrt(num)做循环,如果num%i==0,则因子数+2当然如果两个因子数相同,是必须要去重的思路优点由于循环做的好,没有了类似于24 = 4*6 = 6*4的这种困扰代码#include <iostream>#includ原创 2015-09-15 15:28:32 · 30239 阅读 · 2 评论 -
【智能查询】:关于智能查找输入的算法实现1
问题描述在生活中我们总有这样的情况,比如说不记得某个单词,然后就大概的去查找该单词,这样就会导致输错的情况,这篇文章实现的算法就是想让用户在输错的情况下如何也能智能匹配到该单词。举个例子:字符串为apple 我输入了pplea,这样五个字母都是一致的,只是顺序不一样而已,因此能够认为该用户输对了单词,进行准确的查找可以参照:刘汝佳 算法入门 字符串模块等章节解题思路对字符串进行处理,想要查找到原创 2015-09-20 11:34:09 · 690 阅读 · 0 评论 -
【模式匹配】:关于模式匹配的算法实现2
前言在上篇博客中,我完成了这么一个功能,输入一个单词的混序,然后从数据字典中查找该单词。于是我当时想到一个问题: 我输入的混序词应该是要和被查找的单词是等长的,如果不等长,那么怎么查询?这就是我这篇博客的由来. 举个例子: 查找apple,在上篇我需要输入a p p l e五个字符的混序输入, 在这篇文章实现的算法中,我只需要实现输入 a p p 即可,这样它的匹配率会达到0原创 2015-09-20 13:15:48 · 566 阅读 · 0 评论 -
【经典算法】:狐狸抓兔子问题
前言问题见百度 狐狸抓兔子问题代码全在注释里面了,没啥好说的// 狐狸找兔子问题// author:seen// time:2015-09-20#include <iostream>using namespace std;bool trek[10]; //如果trek[i]==false说明被找到void main(){ memset(trek,true,10*sizeof原创 2015-09-20 14:50:21 · 5871 阅读 · 0 评论 -
【经典算法】:关于硬币称重问题及编程实现
好吧,我承认我是被室友坑了,突然在寝室讨论起这个,从晚上9点多一直搞到了现在,才搞完+_+,不是彻底,但是搞定了大部分的问题问题1,4硬币称重问题 2,8硬币称重问题 3,12硬币称重问题传送门:关于问题的解12硬币问题及解: 12个硬币不知轻重如何用三次称出来? 解法:(要看挺久才能明白) 传送门:解法传送门代码实现:(都聚在一起了) 8枚硬币的没写,因为跟4枚硬币差不多,注意几个程序原创 2015-09-21 00:01:33 · 6412 阅读 · 0 评论 -
【经典算法】:ASCII码打印的算法实现
前言首先要明白一个问题,就是0-255的字符对应着相应的字符,比如说 65对应着大写的A知道了这个代码就好写了,几行就能搞定代码#include <iostream>using namespace std;void main(){ for(int i=0;i<255;i++){ cout<<(char)i<<" "<<i<<endl;//把数字强转为字符即可原创 2015-09-22 12:11:59 · 877 阅读 · 1 评论 -
【算法竞赛题解】:abc:def:ghi = 1:2:3,有新巧妙解法支付宝转5块
原题:用123456789这九个数字组成三个三位数,每个数字都不同。使的abc:def:hij = 1:2:3,求这三个数方法方法似乎也没有啥很特殊的,就是常规的方法而已,先判断一下倍数为1的数,百位肯定只能为1 2 或者是 3 ,这样就缩小了范围,然后就写几个函数,判断三位数每位是否相同,两个三位数三位是否相同,三位三位数三位是否相同,如此下去即可。代码#include <iostream>us原创 2015-09-29 13:41:18 · 2571 阅读 · 1 评论 -
【经典算法】:开灯问题,貌似没啥新解法了。。。
题目有n盏灯,编号为1~n,第一个人把所有灯打开,第二个人按下所有编号为2的倍数开关(这些灯将被关掉),第三个人按下所有编号为3的倍数的开关(其中关掉的灯将被打开,开着的灯将被关闭),一次类推,一共有k个人,问最后哪些灯开着?输入: 7 3 输出 : 1 5 6 7思路思路也是挺简单的,用一个布尔数组去保存灯的开关状态,为true时是开着的,false为关闭着的,然后做一次遍历即可,详情看代码原创 2015-09-29 14:06:47 · 7579 阅读 · 0 评论 -
【经典算法】:蛇形填数,最简单的方法了。。。
问题概述什么是蛇形填数,百度一下即可 解法你能发现这里面的数为1到 n*n; 所以写个循环即可while(count<n*n){ while(x+1<n && !a[x+1][y]) a[++x][y]=++count;//右下 while(y-1>=0 &&!a[x][y-1]) a[x][--y]=++count;//向左 while(x-1>原创 2015-09-29 16:20:37 · 10609 阅读 · 0 评论 -
【贪心算法】:经典硬币组成问题,内有问题,搞清楚了支付宝转账5块
题目有一袋硬币,有2角5分的 ,有1角的,有5分的,有1分的 求问现在组成 6 角3 分的钱,该如何组成硬币数最少?解法这里用了贪心算法,就是6角3分钱先往钱大的扣,比如说开始就扣 2角5分,然后剩3角8分,还能扣2角5分,这样每次都往钱最大的扣。思路既是如此,这就是所谓的贪心算法。用简单的言语概括一下贪心算法,每次都是最优解~~~代码(找问题给奖励)代码就是参照上面的解法写出来的,似乎也没有啥难原创 2015-09-29 17:17:49 · 853 阅读 · 0 评论 -
【经典算法】:银行金额大写转换
说明//你很可能看不懂我写的什么,但是代码可以直接用,不用谢我这篇文章的起因是我想写一个编译原理的工具,后来我顺便想到了字符对应,于是我脑洞大开,就想到了这个银行大写金额转换的工具。思路跟我的上篇博客那个罗马数字的转换也是一回事噢,对了,为了防止来到本博客的小伙伴还不知道我讲的什么,我决定讲下这个程序的功能。 实现了 把银行票据上的数字转换为中文金额比如: 输入31655427 就会显示 叁仟壹原创 2015-10-09 15:05:28 · 1346 阅读 · 0 评论 -
【经典算法】:英文文章统计字符频率
题意解析比如说我存了一些字符在txt文件里面,比如说 a.txt 里面存了 abc edf ccdef 字符这样这个程序能够实现统计文件里面有多少字符,多少种字符,每个字符出现的频率上个例子应该是 11个字符 6种字符,a 1个 b 1个 c 3个 d 2个 e 2个 f 2个实现思路1)读入文件存进char 数组里面去 2)对单个字符进行分析,如果是出现过的就进行单个的统计放到原创 2015-10-11 18:01:58 · 3723 阅读 · 0 评论 -
【经典算法】:基于中文字符分析的统计频率算法实现
前言//这篇文章和我的上篇文章 :英文频率统计 //息息相关,可以作为参考正文:在生活中,我们会有这样的困扰,比如说要统计一篇作文中 某个字符出现的次数,该咋办?人工肯定会这么弄,把一篇文章从第一个数到最后一个,然后统计出来这样确实不错,但是当文章足够大时就显得特别费劲,并且特别笨重,所以就一定要智能的完成这个功能,这篇文章所介绍的技术就是这个,当然基于这个基础还能干很多的事,这得需要探讨才能发现原创 2015-10-11 23:07:11 · 2353 阅读 · 2 评论 -
【经典算法】:如何判断整数和浮点数是否相等
这个问题来自于我解决一个叫做五猴分桃的问题 其中会出现这么一些数据 我需要在右边第二栏数据里面找到整数型的数据,比如说 3121这类的数据但是我给第二栏定义的是float型的数据,如何判断这个float型的数据是不是整数呢?用了如下方法,注意看!!! int fun(float num){ int temp = (int)num; if(temp==num) return原创 2015-11-04 15:57:11 · 4900 阅读 · 0 评论 -
五猴分桃问题详解
题目有5只猴子在海边发现一堆桃子,决定第二天来平分.第二天清晨,第一只猴子最早来到,它左分右分分不开,就朝海里扔了一只,恰好可以分成5份,它拿上自己的一份走了.第2,3,4,5只猴子也遇到同样的问题,采用了同样的方法,都是扔掉一只后,恰好可以分成5份.问这堆桃子至少有多少只.据说没有一个同学能当场做出答案.怎么解?(据说这道问题是李政道教授提出来的)一般性的解法然后对于这道题思考,我能给出一个公式,原创 2015-11-04 22:00:26 · 18711 阅读 · 1 评论 -
【算法竞赛】:最小周期串
题目如果一个字符串可以由某个长度为K的字符串重复多次得到,我们说该串以K为周期,例如: abcabcabcabc以3为周期(注意,它也以6和12为周期)。输入一个长度不超过80的串,输出它的最小周期思路思路其实已经体现在题目中了,假设一个周期,然后满足的条件是周期肯定被串长度整除,然后从最小的开始遍历,其中遍历时满足后面每个周期里的数都和第一个周期相同,就输出该周期,该周期肯定是最小的。仔细看代码原创 2015-11-12 13:53:31 · 867 阅读 · 0 评论 -
【算法竞赛】:分数拆分
题目输入正整数K,找到所有的正整数x>=y,使得1/k = 1/x+1/y 样例输入: 2 12 样例输出: 思路:对等式进行化简,然后得到K,x,y的一个关系式: x = k*y/(y-k); 然后对y进行遍历,y肯定是大于k小于等于2*k,这个可以通过那个公式判断 然后遍历时候算出x,如果算出X为整数切X大于等于Y,则输出结果 = =代码// author:seen/// 算法原创 2015-11-12 14:02:25 · 1469 阅读 · 0 评论 -
【算法竞赛】:进位数统计
题目给出两个数a,b,例如a=123,b = 456这两个数,算出这两个数相加过程中产生了多少次进位?思路思路就是最简单的,从个位开始加,然后算出每次算完的进位用c来存储,c只能为0或者1,然后算完之后C更新,如果C==1,表示有进位,然后全局变量ans(存储最终进位结果的)++;技巧性的东西在于如何用一个简单的循环做到从个位数相加? 请详细看代码 可能上段说的不是很明白,但是看了代码就懂了原创 2015-11-12 14:14:31 · 863 阅读 · 0 评论 -
【经典算法】:硬币组成问题
题目给出1角,2角,五角的硬币,求构成一块钱,一共有多少种方法?思路做一次三重遍历即可,每有满足的条件时,就把统计的结果输出即可,详细见代码代码//x代表1角硬币,y代表2角硬币,z代表5角硬币,count记录了满足的次数#include <iostream>using namespace std;int count=0;int main(){ for(int x=0;x<=10;x原创 2015-11-20 17:21:09 · 1498 阅读 · 0 评论 -
【经典算法】:二分查找
前言二分查找这种老生常谈的话题,说的很简单,但是仍然有些大伙不明白,所以这里希望自己能够写出一篇很浅显易懂的博客帮助大家理解二分查找的规则给定数组已经排序好,然后对其进行编号。这里我们默认是从小到大的,否则算法就要进行更改了 = =思想: 因为数组是有序的,所以每次和数组中间的一个比较,通过和其大小的关系,然后再折半比较 疑问:我想很多同学不明白的是为什么这种方式就能满足一定能查找出想要的结果。原创 2015-11-23 00:43:25 · 1874 阅读 · 2 评论 -
【经典算法】:用递归求1*2*3*...*n
题目如题所示解题思路比较简单的递归,思路有点同我之前的走楼梯问题代码#include <iostream>using namespace std;int fun(int i,int pos,int n){ //用i记录增量,用pos记录结果,估计我以后写的递归代码都会如如此了 = = if(i==n){ return pos; }原创 2015-11-23 01:01:02 · 5227 阅读 · 0 评论 -
【面试题】:全排列
前言全排列问题网上一搜一大堆,我这里也是写的中规中举,没有什么出彩的地方。这里只是告诉大家,全排列见人见智,首先自己多想想肯定是好的,然后自己试着编码也是挺好的。全排列有递归和非递归两种解决方案,我这里用的是递归的方法,递归的调用就是一个排列后面的所有数都和这个数进行交换思路如上,递归难懂,需要自己多想想代码#include <iostream>using namespace std;void原创 2015-11-24 13:22:42 · 558 阅读 · 0 评论 -
【经典算法】:英雄联盟中打字屏蔽系统的实现
前言在玩英雄联盟中玩家经常会出现这种问题,喜欢打字喷人,比如说喜欢喷人说:操你妈,狗日的,操了。你妈逼的,傻逼等。。。。这里会出现一个词语叫做高频词汇,比如说上述那些词语就是如此,上述词语会被系统自动替换成*号、举个例子:输入“我操你妈逼啊”因为系统会把操你妈认为是高频词汇,所以输出:我*逼啊 懂了吧,是不是好简单具体实现过程首先要大胆的猜测一下英雄联盟真实的打字屏蔽系统是怎么样子的。 我觉得是原创 2015-11-25 00:39:00 · 3139 阅读 · 2 评论 -
【经典算法】:插入排序的实现,通过交换,与众不同!
前言在我的博客里面,我前面写了一篇关于插入排序的实现报告,这篇报告中规中矩,就是最基本的那种插入排序,一个函数起码也得写的估计有20多行代码,然后今天突然灵感一来,发现一种更加高效的方法,然后撰一篇文以记之,希望大家能够喜欢。 附上我的上篇插入排序博文链接: http://blog.csdn.net/qq_23100787/article/details/48159551介绍插入排序无非就是这样原创 2015-11-26 13:30:33 · 1266 阅读 · 1 评论 -
【经典算法】:希尔排序的实现
希尔排序我感觉并没有什么用 = =因为希尔排序事实上是对插入排序的一个复杂化,在插入排序的基础上引入了一种分组机制,所以这种排序事实上是复杂了。并且这种排序和插入排序的实现机制非常相似,只要稍微增加一点分组的代码,然后再进行分组插入即可 = =参考我上篇文章的插入排序:http://blog.csdn.net/qq_23100787/article/details/50054773原创 2015-11-26 13:49:58 · 782 阅读 · 0 评论 -
【经典算法】:最长公共子序列(LCS问题,用遍历实现)
题目给出两个字符串,求两个字符串的最长公共子序列思路对两个字符串任意一个字符串s1进行遍历,然后查找s2中与s1[i]相同的位置,每次相同时就同时设两个变量pos1,pos2记录下位置然后往后比较,一直比较到不相同的时候为止,记录下来这个串的长度max。每次得到max之后和之前的公共子串长度相比较,如果大于之前的,就把这次的子串长度设为是最长的按照上述思路逐步进行,最后得到一个最长的子串以及其初始位原创 2015-11-27 17:22:47 · 724 阅读 · 0 评论 -
【经典算法】:求一个字符串的主元素(o(n)复杂度)
这里举个例子 主元素,就是超过全部一半的元素。算法思路说起来挺费劲的 - -就是设置一个变量和后面的相比较,如果相等,设置count++; 不相等count–;当count = 0时更新变量这个基于最基本的原理就是主元素超过总元素的一半这里附上代码:#include <iostream>using namespace std;int main(){ char str[50],temp原创 2015-12-28 23:05:34 · 866 阅读 · 0 评论 -
【经典算法】:字符串转换为int型
前提给大家要说的是,这里的字符串只能是一串数字,而不能是abc这种然后说说做的思路比如字符9在ASCII码表里的值为:39 而字符0在ASCII码表里的值为:0 所以用’9’-‘0’就得到了字符’9’对应的真实数字9 以上为原理1然后说下a b c d e组成一个五位数类似于这种数如何获取其数值 方法是如下: 做一次遍历,每次加上新进来的一个数,然后用得到的和*10,逐步遍历到最后就能获得原创 2015-12-31 17:37:34 · 1962 阅读 · 0 评论 -
【经典算法】:运动会问题
运动会开了N天,一共发出金牌M枚。第一天发金牌1枚加剩下的七分之一枚,第二天发金牌2枚加剩下的七分之一枚,第3天发金牌3枚加剩下的七分之一枚,以后每天都照此办理。到了第N天刚好还有金牌N枚,到此金牌全部发完。编程求N和M。 关键要分析出一个后一天和前一天的金牌数的关系,关系如下: gold[i] = gold[i+1]*7/6+i; i+1指后一天,i指当天附上代码:#include <ios原创 2016-01-05 13:18:03 · 3791 阅读 · 2 评论 -
【经典算法】:欧几里得算法求最大公约数
前言欧几里得算法就是一个叫做欧几里得的数学家提出来的一种算法用来可以计算两个数的最大的公约数,和最简单的那种枚举不同,这种算法有种巧妙的计算。 当然,我们不是数学家,只是计算机从业者,因此对于算法的详细证明就不说了,就只写写简单的算法算法核心算法 gcd(m,n) = gcd(n,m%n); 反复利用这个公式,建立的前提是m>n; 最后结束的条件是 n ==0 ;代码实现这里有递归和非递归版本原创 2015-12-17 10:11:00 · 1182 阅读 · 0 评论 -
【经典工具】:如何通过程序获得系统时间
这个程序是用C实现的, 先要说一个结构体,非常重要,用来存储时间结构体我们用脚想都能想到,时间是这么计数的年 - 月 -日 - 时 - 分 -秒so…struct tm(这是个结构体,这个结构体储存了时间信息) – 时间结构,time.h 定义如下: int tm_sec; int tm_min; int tm_hour; int tm_mday; int tm_mon;原创 2015-12-31 17:27:25 · 600 阅读 · 0 评论 -
【经典算法】:翻转句子中单词的顺序
题意翻转句子中单词的顺序。 题目:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。 句子中单词以空格符隔开。为简单起见,标点符号和普通字母一样处理。 例如输入“I am a student.”,则输出“student. a am I”。思路把这次空格和下一次空格的地址记录下来,然后按照某种格式输出 注意的是:记录地址需要用int数组代码#include <iostream>us原创 2015-12-31 17:44:18 · 1256 阅读 · 0 评论 -
【经典算法】:皇帝的遗产
国王分财产。某国王临终前给儿子们分财产。他把财产分为若干份,然后给第一个儿子一份,再加上剩余财产的1/10;给第二个儿子两份,再加上剩余财产的1/10;„„;给第i个儿子i份,再加上剩余财产的1/10。每个儿子都窃窃自喜。以为得到了父王的偏爱,孰不知国王是“一碗水端平”的。请用程序回答,老国王共有几个儿子?财产共分成了多少份? 源程序:附上代码#include <iostream>using na原创 2016-01-05 13:19:54 · 2770 阅读 · 0 评论 -
【贪心法】:人民币找钱问题
题目在贪心算法里面最常见的莫过于找零钱的问题了,题目大意如下,对于人民币的面值有1元 5元 10元 20元 50元 100元,下面要求设计一个程序,输入找零的钱,输出找钱方案中最少张数的方案,比如123元,最少是1张100的,1张20的,3张1元的,一共5张!思路作一个循环,每次从大的钱遍历。如果还能扣除该钱,就扣除,否则往下遍历,同时把找出去的钱进行记录 代码片:while(!flag){原创 2016-01-10 00:54:29 · 3013 阅读 · 0 评论 -
【经典算法】:兔子繁殖问题
有一种动物,它出生后两天后就开始以每天一只得速度繁殖,假设有一天,有一只这样的动物(该动物刚出生,从第三天开始繁殖后代),到第11天,共有多少只?有一个非常明智的思考,思考过程如下: 我们思考第N天的兔子是如何来的,首先第N-1天的兔子都会存活到第N天,并且不会繁殖 第N-2天的兔子都会在第N天繁殖,所以我们可以得到一个递推公式: (假设第N天的兔子为F(N)) F(N) = F(N-1)原创 2016-03-01 13:09:28 · 13421 阅读 · 0 评论 -
【经典算法】:哈希方法
前言作者在这里体会到了一种非常好用的方法,就是把各种变量的值存在哈希表里面,也可以把各种变量的比较用哈希表进行,深深的感受到了这种方法的遍历,然后想将其发扬光大,因此撰写此文,但是作者水平有限,可能不能完全把大家讲明白,希望大家有不懂得地方来留言问我正文哈希表的前奏 给出一个很简单的例子 比如说一串string : software 这个string中的每个字符都可以存进哈希表里面 哈希表就原创 2016-01-07 17:36:05 · 1669 阅读 · 0 评论