# algorithmTest **Repository Path**: wuyinghao/algorithmTest ## Basic Information - **Project Name**: algorithmTest - **Description**: 一些算法题,主要来自庞果网 - **Primary Language**: C++ - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2016-04-27 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## 算法说明 ## --- 都是一些来自[庞果网](http://pongo.cn)的题目,具体算法说明参见[blog](http://blog.csdn.net/ygrx) ### largestRect.cc ### --- 给定直方图,每一小块的height由N个非负整数所确定,每一小块的width都为1,请找出直方图中面积最大的矩形。 如下图所示,直方图中每一块的宽度都是1,每一块给定的高度分别是[2,1,5,6,2,3]: | | | | | | | | | | | | | | | | | | | 面积最大值是5和6那个矩形,面积为10 --- ### minNum.cc ### --- 给了A、B两个单词和一个单词集合Dict,每个的长度都相同。 我们希望通过若干次操作把单词A变成单词B,每次操作可以改变单词中的一个字母,同时,新产生的单词必须是在给定的单词集合Dict中。 求所有行得通步数最少的修改方法。 举个例子如下: Given: A = "hit" B = "cog" Dict = ["hot","dot","dog","lot","log"] Return [["hit","hot","dot","dog","cog"],["hit","hot","lot","log","cog"]] 即把字符串A = "hit"转变成字符串B = "cog",有以下两种可能: "hit" -> "hot" -> "dot" -> "dog" -> "cog" "hit" -> "hot" -> "lot" -> "log" -> "cog" --- ### palindrome.cc ### --- 回文字符串是指从左到右和从右到左相同的字符串,现给定一个仅由小写字母组成的字符串,你可以把它的字母重新排列,以形成不同的回文字符串。 - 输入:非空仅由小写字母组成的字符串,长度不超过100; - 输出:能组成的所有回文串的个数(因为结果可能非常大,输出对1000000007取余数的结果)。 例如: - 输入"aabb" - 输出为2(因为“aabb”对应的所有回文字符串有2个:abba和baab) --- ### perfect.cc ### --- 我们要给每个字母配一个1-26之间的整数,具体怎么分配由你决定,但不同字母的完美度不同, 而一个字符串的完美度等于它里面所有字母的完美度之和,且不在乎字母大小写,也就是说字母F和f的完美度是一样的。 现在给定一个字符串,输出它的最大可能的完美度。 例如:dad,你可以将26分配给d,25分配给a,这样整个字符串最大可能的完美度为77。 --- ### water.cc ### --- 有两个容器,容积分别为A升和B升,有无限多的水,现在需要C升水。 我们还有一个足够大的水缸,足够容纳C升水。起初它是空的,我们只能往水缸里倒入水,而不能倒出。 可以进行的操作是: - 把一个容器灌满; - 把一个容器清空(容器里剩余的水全部倒掉,或者倒入水缸); - 用一个容器的水倒入另外一个容器,直到倒出水的容器空或者倒入水的容器满。 **问是否能够通过有限次操作,使得水缸最后恰好有C升水。** - 输入:三个整数A, B, C,其中 0 < A , B, C <= 1000000000 - 输出:0或1,表示能否达到要求。 --- ### xmlParser.cc ### --- 本题来自蓝港在线技术团队的idea,详情如下: XML-可扩展标记语言 ,用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言,被广泛的运用于数据传输和存储。 请编写一段程序,不使用语言之外的开源库,解析对应的XML文件,并把输出结果打印出来。 举个例子如下,当给定下述XML文件时(注:不需要将输入输出格式话,只是举个例子): 它应该输出: Books Book 1 Name:The C++ Programming Language Author:Bjarne Stroustrup Book 2 Name:Effective C++ Author:Scott Meyers - 本题输入:简化的一段xml文件,用字符串表示,如下(属性名字不包含引号和等号,也不包含大于小于等特殊字符,详细规则见下面的答题说明) `string in = "";` - 本题输出:对输入的xml字符串解析,得到输出如下: `string out = "Books\r\n\tBook 1\r\n\t\tName:The C++ Programming Language\r\n\t\tAuthor:Bjarne Stroustrup\r\n\tBook 2\r\n\t\tName:Effective C++\r\n\t\tAuthor:Scott Meyers";` --- ### minLength.cc ### --- 给定一个字符串,仅由a,b,c 3种小写字母组成。当出现连续两个不同的字母时,你可以用另外一个字母替换它,如: - 有ab或ba连续出现,你把它们替换为字母c - 有ac或ca连续出现时,你可以把它们替换为字母b - 有bc或cb 连续出现时,你可以把它们替换为字母a。 你可以不断反复按照这个规则进行替换,你的目标是使得最终结果所得到的字符串尽可能短,求最终结果的最短长度。 - 输入:字符串。长度不超过200,仅由abc三种小写字母组成。 - 输出: 按照上述规则不断消除替换,所得到的字符串最短的长度。 例如: - 输入cab,输出2。 因为我们可以把它变为bb或者变为cc - 输入bcab,输出1。 尽管我们可以把它变为aab -> ac -> b, 也可以把它变为bbb,但因为前者长度更短,所以输出1。 --- ### sortArray.cc ### --- 本题来自caopengcs,只要你有兴趣,每个人都可以出题(出题入口在主页右侧边栏“贡献题目”内),以下是题目详情: 给定一个包含1-n的数列,我们通过交换任意两个元素给数列重新排序。 求最少需要多少次交换,能把数组排成按1-n递增的顺序,其中,数组长度不超过100。 例如: - 原数组是3,2,1, 我们只需要交换1和3就行了,交换次数为1,所以输出1。 - 原数组是2,3,1,我们需要交换2和1,变成1,3,2,再交换3和2,变为1,2,3,总共需要的交换次数为2,所以输出2。 函数头部: C/C++ int run(const int *a,int n); --- ### subArray.cc ### --- 本题同样来自caopengcs,只要你有兴趣,每个人都可以出题(出题入口在主页右侧边栏“贡献题目”->“我要发布”内),以下是题目详情: - 子序列的定义:对于一个序列a=a[1],a[2],......a[n],则非空序列a'=a[p1],a[p2]......a[pm]为a的一个子序列 - 其中1<=p1