经典算法C++版(参考一线码农博文)
鉴于一线码农的算法博文基本通过C#完成,此处用C++再实现一遍,具体解法可参考其博文。
地址:http://www.cnblogs.com/huangxincheng/category/401959.html。
1.百钱买百鸡(降低时间复杂度)
void NumofHen_1()
{
int x, y, z;
for ( x = ; x < ; x++)
{
for ( y = ; y < ; y++)
{
z = - x - y; if ((z % == ) && (( * x + * y + z / ) == ))
{
cout << "公鸡:" << x << " 母鸡:" << y << " 小鸡:" << z << endl;
}
}
}
} void NumofHen_2()
{
int x, y, z;
for (size_t k = ; k < ; k++)
{
x = * k;
y = - * k;
z = + * k;
cout << "公鸡:" << x << " 母鸡:" << y << " 小鸡:" << z << endl;
}
}
2.五家五井(不定方程组,运用数据为整数特性)
代码省略,详情见一线码农相应博客。
3.猴子吃桃(尾递归)
题目:猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾就多吃了一个。第二天早上又将剩下的桃子吃了一半,还是不过瘾又多吃了一个。
以后每天都吃前一天剩下的一半再加一个。到第10天刚好剩一个。问猴子第一天摘了多少个桃子?
int SumPeach1(int day)
{
if (day == )
return ;
else return * SumPeach1(day + ) + ;
} void NumofPeach_1()
{
int sum = SumPeach1();
cout << "桃子数目:" << sum << endl;
} //尾递归(剑指offer上有类似题目,判定二叉树是否平衡)
int SumPeach_2(int day, int sum)
{
if (day == )
return sum;
else return SumPeach_2(day + , * sum + );
} void NumofPeach_2()
{
int sum = SumPeach_2(, );
cout << "桃子数目:" << sum << endl;
}
尾递归将每次计算结果进行传递,但是具体效果得看编译器是否进行了相应优化。
此题还有更为简单的做法,具体为参考每次计算数值的规律性,与2的次方存在对应关系。
4.寻找最长公共子序列(顺序,可以非连续)
void sub_str(unsigned char** mat, const int i, const int j, const string& s,string& substr)
{
if (i == || j == )
return; if ( == mat[i][j])
{
substr += s[j - ];
sub_str(mat, i - , j - , s, substr);
}
else
{
if ( == mat[i][j])
sub_str(mat, i - , j, s, substr);
else if ( == mat[i][j])
sub_str(mat, i, j - , s, substr);
}
} //注意此处是寻找顺序的最长公共子序列(可以非连续)
void LengthofSubstr_1(const string& s1, const string& s2)
{
int i, j, len1 = s1.length(), len2 = s2.length();
if ( == len1 || == len2) return; int **matrix; //创建矩阵并初始化
matrix = new int*[len1 + ];
//0无意义,1表示左边,2表示上面,3表示左上角
unsigned char **signmat;
signmat = new unsigned char*[len1 + ];
for (i = ; i < len1 + ; i++)
{
matrix[i] = new int[len2 + ];
signmat[i] = new unsigned char[len2 + ];
} //此处其实无需全部初始化,初始化边界元素即可
for (i = ; i < len1 + ; i++)
for (j = ; j < len2 + ; j++)
{
matrix[i][j] = signmat[i][j] = ;
} //填充矩阵
for (i = ; i < len1 + ; i++)
{
for (j = ; j < len2 + ; j++)
{
if (s1[i - ] == s2[j - ])
{
signmat[i][j] = ;
matrix[i][j] = matrix[i - ][j - ] + ;
}
else
{
//比较“左边”和“上边”的信息,选取最大值进行填充
if (matrix[i - ][j] >= matrix[i][j - ])
{
signmat[i][j] = ;
matrix[i][j] = matrix[i - ][j];
}
else
{
signmat[i][j] = ;
matrix[i][j] = matrix[i][j - ];
}
}
}
} string substr; //将最长公共子序列输出
sub_str(signmat, len1, len2, s2, substr);
std::reverse(substr.begin(), substr.end()); cout << "最大公共子序列长度为:" << matrix[len1][len2] << ";最长字串为:" << substr << endl; //释放矩阵
for (i = ; i < len1 + ; i++)
{
delete[] matrix[i];
delete[] signmat[i];
}
delete[] signmat;
delete[] matrix;
}
个人建议还是将中间过程进行输出,这样方便理解,最好是看下面网址的图解。
http://www.cnblogs.com/huangxincheng/archive/2012/11/11/2764625.html
不过博客里面的图解初始位置应该为0,自己输出中间变量的就会比较清楚。漂亮的解法。
5.字符串相似度
对于两个字符串A和B,通过基本的增删改将字符串A改成B,或者将B改成A,在改变的过程中我们使用的最少步骤称之为“编辑距离”。
虽然没太看懂,不过这个解题思路和上面类似,仅仅是初始化方式进行了改变,意义完全不一样了,赞
int MinofThree(const int x1, const int x2, const int x3)
{
int min = x1 < x2 ? x1 : x2;
return x3 < min ? x3 : min;
} int SameofStr(const string& s1, const string& s2)
{
int i,j,len1 = s1.length(), len2 = s2.length();
if (len1 <= || len2 <= ) return ; int **matrix = NULL;
matrix = new int*[len1 + ];
for (i = ; i < len1 + ; i++)
matrix[i] = new int[len2 + ];
//初始化矩阵,跟前面的求公共字符串初始化不同
for (i = ; i < len1 + ; i++)
matrix[i][] = i;
for (i = ; i < len2 + ; i++)
matrix[][i] = i; for ( i = ; i < len1+; i++)
{
for (j = ; j < len2 + ; j++)
{
if (s1[i - ] == s2[j - ])
{
matrix[i][j] = matrix[i - ][j - ];
}
else
{
matrix[i][j] = MinofThree(matrix[i - ][j], matrix[i][j - ], matrix[i - ][j - ]) + ;
}
}
} int res = matrix[len1][len2];
for (i = ; i < len1 + ; i++)
delete[] matrix[i];
delete[] matrix; //返回字符串的编辑距离
return res;
}
6.KMP算法(暂时未理解)
void GetNextVal(int next[], const string& str)
{
//前缀起始位置以及后缀起始位置
int k = -, j = ;
next[j] = -; while (j < str.length() - )
{
if (- == k || str[k] == str[j])
{
next[++j] = ++k;
}
else
{
k = next[k];
}
}
} //s1为主串,s2为子串
int KMP(const string& s1, const string& s2)
{
int i = , j = , len1 = s1.length(), len2 = s2.length(); if (len1 < len2 || len1 <= || len2 <= )
return -;
else if (len1 == len2)
{
for (i = ; i < len1; i++)
if (s1[i] == s2[i])
return -;
return ;
} int *next = new int[len2];
memset(next, , sizeof(next));
GetNextVal(next, s2); while (i < len1&&j < len2)
{
if (- == j || s1[i] == s2[j])
{
++i;++j;
}
else
{
j = next[j];
}
} delete[] next;
if (j == len2)
return i - len2;
else return -;
}
7.改进版KMP算法
void getnext(const string& T,int next[])
{
next[] = -;
int i = , j = -; //分别表示前后缀串的初始位置 while (i < T.length() - )
{
if (- == j || T[i] == T[j])
{
++i;++j;
if (T[i] != T[j])
next[i] = j;
else next[i] = next[j];
}
else
{
j = next[j];
}
}
} //pos表示从主串的第pos个位置进行匹配
int KMP(const string& S, const string& T, int pos = )
{
int i = pos, j = -, len1 = (int)S.length(), len2 = (int)T.length();
int *next = new int[T.length()]; getnext(T, next);
//此处不能使用i < S.length() && j < T.length()
//因为length()函数返回的为size_t,负数与其比较时会转换为size_t
while (i < len1&&j < len2)
{
if ((- == j) || S[i] == T[j])
{
++i;++j;
}
else
{
j = next[j];
}
}
delete[] next; if (j == T.length())
return i - T.length();
else return -;
}
8.华为机试题目,猴子分桃
//猴子分桃算法
long long NumOfPeach(int n)
{
if (n < || n>)
return -; long long i, j, num, tmp;
for (i = ; ; ++i)
{
num = i;
for (j = ; j < n; j++)
{
if (num%n == )
{
tmp = (num - ) / n;
num = num - - tmp;
}
else break;
}
if (j == n)
break;
}
return i;
}
经典算法C++版(参考一线码农博文)的更多相关文章
- HTML与CSS入门经典(第9版)试读 附随书源码 pdf扫描版
HTML与CSS入门经典(第9版)是经典畅销图书<HTML与CSS入门经典>的最新版本,与过去的版本相同,本书采用直观.循序渐进的方法,为读者讲解使用HTML5与CSS3设计.创建并维护世 ...
- 经典排序算法 — C# 版(上)
提起排序,与我们的息息相关,平时开发的代码少不了排序. 经典的排序算法又非常多,我们怎么评价一个排序算法的好坏呢? 其实可以这样想,要细致的比较排序算法好坏,那我们就从多方面尽可能详细的对比 一.效率 ...
- 老码农冒死揭开行业黑幕:如何编写无法维护的代码[ZZ]
下面是一篇有意思的"代码大全",可谓 逆软件工程. 老码农冒死揭开行业黑幕:如何编写无法维护的代码 原文如下 让自己稳拿铁饭碗 ;-) – Roedy Green(翻译版略有删节) ...
- 【整理】待毕业.Net码农就业求职储备
声明:本文题目来源于互联网,仅供即将从学校毕业的.Net码农(当然,我本人也是菜逼一个)学习之用.当然,学习了这些题目不一定会拿到offer,但是针对就业求职做些针对性的准备也是不错的.此外,除了技术 ...
- .net 码农转战 iOS - 初探
好久没写博客了,之前还打算把毕业设计中涉及到的两个算法拿出来说说(脸型分析 + 声音分析),博文都写了一半了,后来实在太忙了,那篇随笔也就沉在草稿列表中没动过. 我原先是专职 .net 开发的,在公司 ...
- 《码农周刊》干货精选(Python 篇)
<码农周刊>已经累计发送了 38 期,我们将干货内容进行了精选.此为 Python 篇. <码农周刊>往期回顾:http://weekly.manong.io/issues/ ...
- 经典算法题每日演练——第十四题 Prim算法
原文:经典算法题每日演练--第十四题 Prim算法 图论在数据结构中是非常有趣而复杂的,作为web码农的我,在实际开发中一直没有找到它的使用场景,不像树那样的频繁使用,不过还是准备 仔细的把图论全部过 ...
- 经典算法研究系列:二、Dijkstra 算法初探
July 二零一一年一月 本文主要参考:算法导论 第二版.维基百科. 一.Dijkstra 算法的介绍 Dijkstra 算法,又叫迪科斯彻算法(Dijkstra),算法解决的是有向图中单个源点到 ...
- 关于期权池Option Pools与Vesting:码农创业防身必备法器
之前又看到饿了么创始人团队纠纷的几篇文章,参考了百科.wiki.36Kr.虎嗅.知乎以及邵亦波老师的文章,对之前一直感兴趣的期权汇编初略总结了下 ,仍觉粗糙,对一些具体操作还是不甚了了,不过感觉在中国 ...
随机推荐
- web开发实战--弹出式富文本编辑器的实现思路和踩过的坑
前言: 和弟弟合作, 一起整了个智慧屋的小web站点, 里面包含了很多经典的智力和推理题. 其实该站点从技术层面来分析的话, 也算一个信息发布站点. 因此在该网站的后台运营中, 富文本的编辑器显得尤为 ...
- 《Web全栈工程师的自我修养》读书笔记(转载)
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/5 ...
- 只需三步 快速完善网站Sitemap
越来越多的SEOer把优化的重点放在了站内优化上,细心的朋友应该查看一些前辈的robots.txt的时候不难发现,他们的robots中都加 入了一句Sitemap: http://www.dewang ...
- 算法小节(一)——斐波那契数列(java实现)
看到公司的笔试题中有一道题让写斐波那契数列,自己忙里偷闲写了一下 什么是斐波那契数列:斐波那契数列指的是这样一个数列 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...
- Git远程仓库(github
一.创建远程仓库(github) 首先到https://github.com注册一个账号,创建自己的Git,点击repositories,再点new 名字自定义,比如叫fansik,选择public点 ...
- hrbust 1481
/* 构造特定条件的68序列:给定目标串中6 8 68 86 这四种字串的个数a b p q ,输出所有满足条件的字符串中代表的数字最小的那个 // hrboj 1481 ______________ ...
- SQL Server系统存储过程
1. execute sp_databases 查询当前所有数据库大致信息(名称,大小等) 2. exec sp_helpdb [Myschool] 返回数据库的所有详细信息(数据库大小,位置,文 ...
- C语言结构体位域
demo: typedef struct { int a:2; int b:2; int c:1; }test; int main() { test t; t.a=1; t.b=3; t.c=1; / ...
- [课程设计]Scrum 1.4 多鱼点餐系统开发进度
Scrum 1.4 多鱼点餐系统开发进度 (点餐页面框架布置) 1.团队名称:重案组 2.团队目标:长期经营,积累客户充分准备,伺机而行 3.团队口号:矢志不渝,追求完美 4.团队选题:餐厅到店点餐系 ...
- ALV 顶栏的按钮设定
*&---------------------------------------------------------------------* *& Report ZHJ_TEST0 ...