From 08b93b3f85cbb17a7f1ada0d11f462757d50b91a Mon Sep 17 00:00:00 2001 From: nonstriater <410495266@qq.com> Date: Wed, 2 Dec 2015 15:06:16 +0800 Subject: [PATCH] add OJ --- README.md | 9 ++-- 算法问题选编/leetcode.md | 11 +++++ 算法问题选编/九度OJ.md | 5 ++ 算法问题选编/字符串.md | 99 +++++++++++++++++++++++----------------- 4 files changed, 77 insertions(+), 47 deletions(-) create mode 100644 算法问题选编/leetcode.md create mode 100644 算法问题选编/九度OJ.md diff --git a/README.md b/README.md index f0b3b08..2351716 100644 --- a/README.md +++ b/README.md @@ -197,11 +197,12 @@ http://www.cs.usfca.edu/~galles/visualization/Algorithms.html ###编程网站 -http://leetcode.com/ -http://oj.leetcode.com/ -http://openjudge.cn/ POJ。这有个POJ上的ACM训练方案 http://www.java3z.com/cwbwebhome/article/article19/res041.html -http://ac.jobdu.com/index.php 九度OJ +http://leetcode.com/ +http://openjudge.cn/ 开放在线程序评测平台,可以床架自己的OJ小组 +http://ac.jobdu.com/index.php 九度OJ +这有个ACM训练方案 http://www.java3z.com/cwbwebhome/article/article19/res041.html + ## 补充:C语言代码规范 diff --git a/算法问题选编/leetcode.md b/算法问题选编/leetcode.md new file mode 100644 index 0000000..adf5ca2 --- /dev/null +++ b/算法问题选编/leetcode.md @@ -0,0 +1,11 @@ + +题目来自[leetcode](https://leetcode.com/) + + +#### Minimum Height Trees + + + +#### Additive Number + + diff --git a/算法问题选编/九度OJ.md b/算法问题选编/九度OJ.md new file mode 100644 index 0000000..b8f5dca --- /dev/null +++ b/算法问题选编/九度OJ.md @@ -0,0 +1,5 @@ + +题目来自 [九度OJ](http://ac.jobdu.com/index.php) + + + diff --git a/算法问题选编/字符串.md b/算法问题选编/字符串.md index d83937c..abc5f1b 100644 --- a/算法问题选编/字符串.md +++ b/算法问题选编/字符串.md @@ -292,30 +292,6 @@ int atoi(const char *str){ 详细过程也可以[参考这里](http://blog.csdn.net/v_july_v/article/details/9024123) -#### 匹配兄弟字符串 - -如果两个字符串的字符一样,但是顺序不一样,被认为是兄弟字符串,问如何在迅速匹配兄弟字符串(如,bad和adb就是兄弟字符串)。 - -思路:判断各自素数乘积是否相等。更多方法请参见:http://blog.csdn.net/v_JULY_v/article/details/6347454。 - -``` -int isBrother(const char *first,const char *secd) -``` - -思路一: 循环匹配 指数级复杂度 -思路二: 利用质数,平方和比较,但这样必须是2个串的长度要一样,需要的空间比较大,最多256个字节。 - - - -示例代码: - -``` -int isBrother(const char *first,const char *secd){ - -} -``` - - #### 删除串中指定的字符 删除指定的字符以后,后面的字符都要向前移动一位。这种复杂度是O(N^2);那么有没有O(N)的方法呢? @@ -361,15 +337,22 @@ char *delete_occurence_characterset(char *source,const char *del); 题目描述:“abeeeeegaaaffa" 压缩为 "abe5ag3f2a",请编程实现。 +这道题需要注意: +1. 单个字符不压缩 +2. 注意考虑压缩后某个字符个数是多位数(超过10个) +3. 原地压缩最麻烦的地方就是数据移动 + + 这是使用2个指针,一前一后,如果不相等,都往前移动一位;如果相等,后一位变为数字2,且移动后面的指针一位,任然相等则数字加1,不相等 + ``` char *compress(const char *src,char *dest){ } ``` -上面的压缩算法可以看到,压缩算法的效率验证依赖给定字符串的特性,如果'aaaaaaaa....aaa' 这样特征的字符串,使用上面的压缩算法,压缩率接近100%,相反,可能会的0%的压缩率。 +上面的压缩算法可以看到,压缩算法的`效率`验证依赖`给定字符串的特性`,如果'aaaaaaaa....aaa' 这样特征的字符串,使用上面的压缩算法,压缩率接近100%,相反,可能会的0%的压缩率。 @@ -378,13 +361,9 @@ char *compress(const char *src,char *dest){ 如字符串”abc123de4fg56”处理后变为”abcdefg”。注意空间和效率。 (下面的算法只需要一次遍历,不需要开辟新空间,时间复杂度为O(N)) - - - -#### 字符串匹配实现 - -请以俩种方法,回溯与不回溯算法实现。 - +``` +void trim_number(char *source); +``` #### 对称子字符串的最大长度 @@ -397,12 +376,16 @@ char *compress(const char *src,char *dest){ int max_symmetrical_char_length(const char *scr); ``` -思路一:蛮力法,3重循环(类似 求子数组的最大和 fmax(i,j)问题), fmax(i,j)区间i,j是最长的对称字符 +思路一:蛮力法,3重循环(类似 求子数组的最大和 fmax(i,j)问题), fmax(i,j)区间i,j是最长的对称字符 +思路二:遍历所有子串,然后判读是否对称 O(n^2) +思路三:有个O(n)复杂度的 http://www.jb51.net/article/48090.htm -思路二: 遍历所有子串,然后判读是否对称 O(n^2) - -思路三: 有个O(n)复杂度的 http://www.jb51.net/article/48090.htm +``` +int max_symmetrical_char_length(const char *scr){ + +} +``` #### 字符串中找出连续最长的数字串 @@ -413,14 +396,13 @@ int max_symmetrical_char_length(const char *scr); 例如:"abcd12345ed125ss123456789"的首地址传给intputstr后,函数将返回9,outputstr所指的值为123456789 -它的原形是 +它的原形是: ``` int continumax(char *outputstr,char *intputstr) ``` - #### 子串匹配的个数 已知一个字符串,比如asderwsde,寻找其中的一个子字符串比如sde的个数,如果没有返回0,有的话返回子字符串的个数。 @@ -433,7 +415,7 @@ char *sub_str_count(const char *src, const char *substr, int *count) #### 求最大连续递增数字串 -(如“ads3sl456789DF3456ld345AA”中的“456789”) +如“ads3sl456789DF3456ld345AA”中的“456789”就是所求。 ``` int continuousnum(const char *input, char *output) @@ -447,15 +429,46 @@ int continuousnum(const char *input, char *output) 请编写一个函数,输入两个字符串,求它们的最长公共子串,并打印出最长公共子串。 例如:输入两个字符串BDCABA和ABCBDAB,字符串BCBA和BDAB都是是它们的最长公共子串,则输出它们的长度4,并打印任意一个子串。 - -如"abccade","dgcadde"的最大子串为"cad" - -分析:求最长公共子串(Longest Common Subsequence, LCS)是一道非常经典的动态规划题,因此一些重视算法的公司像MicroStrategy都把它当作面试题。 ``` int longest_common_subsequence(const char *s1,const char *s2, char *common) ``` +分析:求最长公共子串(Longest Common Subsequence,LCS)是一道非常经典的动态规划题,因此一些重视算法的公司像MicroStrategy都把它当作面试题。如"abccade","dgcadde"的最大子串为"cad" + + +实例代码: + +``` +int longest_common_subsequence(const char *s1,const char *s2, char *common){ + +} +``` + + +#### 匹配兄弟字符串 + +如果两个字符串的字符一样,但是顺序不一样,被认为是兄弟字符串,问如何在迅速匹配兄弟字符串(如,bad和adb就是兄弟字符串)。 + +思路:判断各自素数乘积是否相等。更多方法请参见:http://blog.csdn.net/v_JULY_v/article/details/6347454。 + +``` +int isBrother(const char *first,const char *secd) +``` + +思路一: 循环匹配 指数级复杂度 +思路二: 利用质数,平方和比较,但这样必须是2个串的长度要一样,需要的空间比较大,最多256个字节。 + + + +示例代码: + +``` +int isBrother(const char *first,const char *secd){ + +} +``` + #### 字符串的排列