update dir
This commit is contained in:
@@ -10,7 +10,7 @@
|
||||
* 子串
|
||||
|
||||
|
||||
#### 翻转句子中单词的顺序
|
||||
## 翻转句子中单词的顺序
|
||||
|
||||
题目:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。句子中单词以空格符隔开。为简单起见,标点符号和普通字母一样处理。
|
||||
例如输入“I am a student.”,则输出“student. a am I”。
|
||||
@@ -79,7 +79,7 @@ char *revert_by_word(char *source){
|
||||
用C语言实现一个revert函数,它的功能是将输入的字符串在原串上倒序后返回。
|
||||
|
||||
|
||||
#### 左旋转字符串
|
||||
## 左旋转字符串
|
||||
|
||||
>字符串的左旋转操作:把字符串前面的若干个字符移动到字符串的尾部。
|
||||
|
||||
@@ -93,7 +93,7 @@ char *left_rotate(char *str,int offset){
|
||||
我们可以abcdef分成两部分,ab和cdef,内部逆序以后,整体再次逆序,就可以得到想要的结果了,也就是跟上面的问题是同样的问题。
|
||||
|
||||
|
||||
#### 判断字符串是否是回文
|
||||
## 判断字符串是否是回文
|
||||
|
||||
分析: 2个指针,一头一尾,逐个比较,都相同就是回文
|
||||
|
||||
@@ -124,7 +124,7 @@ int is_huiwen(const char *source){
|
||||
```
|
||||
|
||||
|
||||
#### 只出现一次的字符
|
||||
## 找到第一个只出现一次的字符
|
||||
|
||||
在一个字符串中找到第一个只出现一次的字符。如输入ahbaccdeff,则输出h。
|
||||
|
||||
@@ -163,7 +163,7 @@ char char_first_appear_once(const unsigned char *source){
|
||||
题目扩展:这里的字符换成整数,整数数量几十TB,海量数据处理,显然hash方法不可能,没有那么大得内容
|
||||
|
||||
|
||||
#### 统计文章里单词出现的次数
|
||||
## 统计文章里单词出现的次数
|
||||
|
||||
设计相应的数据结构和算法,尽量高效的统计一片英文文章(总单词数目)里出现的所有英文单词,按照在文章中首次出现的顺序打印输出该单词和它的出现次数。
|
||||
|
||||
@@ -178,7 +178,7 @@ void statistics(FILE *fd)
|
||||
如果是海量数据里面统计top-k次数的单词呢?
|
||||
|
||||
|
||||
#### 替换空格
|
||||
## 替换空格
|
||||
|
||||
实现一个函数,把每个空格替换成 "%20",如输入“we are happy”,则输出“we%20are%20happy”
|
||||
|
||||
@@ -220,7 +220,7 @@ char *replace_blank(char *source){
|
||||
```
|
||||
|
||||
|
||||
#### 小写字母排在大写字母的前面
|
||||
## 小写字母排在大写字母的前面
|
||||
|
||||
有一个由大小写组成的字符串,现在需要对他进行修改,将其中的所有小写字母排在大写字母的前面(大写或小写字母之间不要求保持原来次序),如有可能尽量选择时间和空间效率高的算法 c语言函数原型:
|
||||
|
||||
@@ -266,21 +266,21 @@ char *proc(char *str){
|
||||
}
|
||||
```
|
||||
|
||||
#### 实现字符串转整型的函数
|
||||
## 实现字符串转整型的函数
|
||||
|
||||
也就是实现函数atoi的功能,这道题目考查的就是对各种情况下异常处理。比如:
|
||||
|
||||
以"213"分析转换成证书的过程。3+1x10+2x100,思路是:每扫描到一个字符,把之前得到的数字*10,再加上当前的数字
|
||||
|
||||
0开头,"0213"
|
||||
正/负数,"-432" ,"--422","++23"
|
||||
浮点数,"43.2344"
|
||||
非法,"2123des"
|
||||
存在空格," -32"," +432"," 234","23 432","353 "," + 321"
|
||||
NULL/空串,这时候返回值0
|
||||
溢出,"32111111112222222222222222222222222222222" , 与 `INT_MAX `比较
|
||||
* 0开头,"0213"
|
||||
* 正/负数,"-432" ,"--422","++23"
|
||||
* 浮点数,"43.2344"
|
||||
* 非法,"2123des"
|
||||
* 存在空格," -32"," +432"," 234","23 432","353 "," + 321"
|
||||
* NULL/空串,这时候返回值0
|
||||
* 溢出,"32111111112222222222222222222222222222222" , 与 `INT_MAX `比较
|
||||
* 如何区分正常的'0'和异常情况下返回的结果"0"? 可以通过一个全局变量 g_status 来标示,值为 kValid/kInvalid。
|
||||
|
||||
如何区分正常的'0'和异常情况下返回的结果"0"? 可以通过一个全局变量 g_status 来标示,值为 kValid/kInvalid。
|
||||
|
||||
|
||||
```
|
||||
@@ -292,7 +292,7 @@ int atoi(const char *str){
|
||||
详细过程也可以[参考这里](http://blog.csdn.net/v_july_v/article/details/9024123)
|
||||
|
||||
|
||||
#### 删除串中指定的字符
|
||||
## 删除串中指定的字符
|
||||
|
||||
删除指定的字符以后,后面的字符都要向前移动一位。这种复杂度是O(N^2);那么有没有O(N)的方法呢?
|
||||
|
||||
@@ -318,7 +318,7 @@ char *delete_occurence_character(char *src , char target){
|
||||
```
|
||||
|
||||
|
||||
#### 在字符串中删除特定的字符
|
||||
## 在字符串中删除特定的字符
|
||||
|
||||
题目:输入两个字符串,从第一字符串中删除第二个字符串中所有的字符。例如,输入”They are students.”和”aeiou”,则删除之后的第一个字符串变成”Thy r stdnts.”。
|
||||
|
||||
@@ -333,7 +333,7 @@ char *delete_occurence_characterset(char *source,const char *del);
|
||||
|
||||
|
||||
|
||||
#### 删除字符串中的数字并压缩字符串
|
||||
## 删除字符串中的数字并压缩字符串
|
||||
|
||||
如字符串”abc123de4fg56”处理后变为”abcdefg”。注意空间和效率。(下面的算法只需要一次遍历,不需要开辟新空间,时间复杂度为O(N))
|
||||
这道题跟上一道题也是一个意思。
|
||||
@@ -360,7 +360,7 @@ char *trim_number(char *source){
|
||||
|
||||
|
||||
|
||||
#### 字符串原地压缩
|
||||
## 字符串原地压缩
|
||||
|
||||
题目描述:“abeeeeegaaaffa" 压缩为 "abe5ag3f2a",请编程实现。
|
||||
|
||||
@@ -384,7 +384,7 @@ char *compress(const char *src,char *dest){
|
||||
|
||||
|
||||
|
||||
#### 字符串中找出连续最长的数字串
|
||||
## 字符串中找出连续最长的数字串
|
||||
|
||||
写一个函数,功能:
|
||||
|
||||
@@ -451,13 +451,13 @@ int longest_continuious_number(const char *input,char *output){
|
||||
|
||||
|
||||
|
||||
#### 求最大连续递增数字串
|
||||
## 求最大连续递增数字串
|
||||
|
||||
如“ads3sl456789DF3456ld345AA”中的“456789”就是所求。这道题在上一道题目的基础上增加了数字要递增的条件。思路跟上面差不多,碰到不递增的数字就相当于第二个数字串了。
|
||||
|
||||
|
||||
|
||||
#### 最长公共子串问题
|
||||
## 最长公共子串问题
|
||||
|
||||
请编写一个函数,输入两个字符串,求它们的最长公共子串,并打印出最长公共子串。
|
||||
|
||||
@@ -481,7 +481,7 @@ int longest_common_subsequence(const char *s1,const char *s2, char *common){
|
||||
|
||||
|
||||
|
||||
#### 对称子字符串的最大长度
|
||||
## 对称子字符串的最大长度
|
||||
|
||||
题目:输入一个字符串,输出该字符串中对称的子字符串的最大长度。比如输入字符串“google”,由于该字符串里最长的对称子字符串是“goog”,因此输出4。
|
||||
|
||||
@@ -491,13 +491,10 @@ int longest_common_subsequence(const char *s1,const char *s2, char *common){
|
||||
int max_symmetrical_char_length(const char *scr);
|
||||
```
|
||||
|
||||
思路一:蛮力法,3重循环(类似 求子数组的最大和 fmax(i,j)问题), fmax(i,j)区间i,j是最长的对称字符
|
||||
思路二:遍历所有子串,然后判读是否对称 O(n^2)
|
||||
思路三:有个O(n)复杂度的算法 http://www.cnblogs.com/McQueen1987/p/3559497.html 分析过程如下:
|
||||
* 思路一:蛮力法,3重循环(类似 求子数组的最大和 fmax(i,j)问题), fmax(i,j)区间i,j是最长的对称字符
|
||||
* 思路二:遍历所有子串,然后判读是否对称 O(n^2)
|
||||
* 思路三:有个O(n)复杂度的算法 http://www.cnblogs.com/McQueen1987/p/3559497.html 分析过程如下:
|
||||
|
||||
1.
|
||||
2.
|
||||
3.
|
||||
|
||||
```
|
||||
int max_symmetrical_char_length(const char *scr){
|
||||
@@ -507,7 +504,7 @@ int max_symmetrical_char_length(const char *scr){
|
||||
|
||||
|
||||
|
||||
#### 子串匹配的个数
|
||||
## 子串匹配的个数
|
||||
|
||||
已知一个字符串,比如asderwsde,寻找其中的一个子字符串比如sde的个数,如果没有返回0,有的话返回子字符串的个数。
|
||||
|
||||
@@ -517,7 +514,7 @@ char *substr_count(const char *src, const char *substr, int *count)
|
||||
|
||||
|
||||
|
||||
#### 请编写能直接实现strstr()函数功能的代码。
|
||||
## 请编写能直接实现strstr()函数功能的代码。
|
||||
|
||||
> strstr(str1,str2) 判断str2是否是str1的子串。
|
||||
|
||||
@@ -531,7 +528,7 @@ char *strstr(const char *source, const char *target){
|
||||
```
|
||||
|
||||
|
||||
#### 匹配兄弟字符串
|
||||
## 匹配兄弟字符串
|
||||
|
||||
如果两个字符串的字符一样,但是顺序不一样,被认为是兄弟字符串,问如何在迅速匹配兄弟字符串(如,bad和adb就是兄弟字符串)。
|
||||
|
||||
@@ -556,7 +553,7 @@ int isBrother(const char *first,const char *secd){
|
||||
|
||||
|
||||
|
||||
#### 字符串的排列
|
||||
## 字符串的排列
|
||||
|
||||
题目:输入一个字符串,打印出该字符串中字符的所有排列。例如输入字符串abc,则输出由字符a、b、c所能排列出来的所有字符串abc、acb、bac、bca、cab和cba。输入字符串 abcca,则输出由 a,b,c排列出来的所有字符串,字符出现个数不变
|
||||
|
||||
@@ -569,21 +566,21 @@ int isBrother(const char *first,const char *secd){
|
||||
|
||||
|
||||
|
||||
#### n个字符串联接
|
||||
## n个字符串联接
|
||||
|
||||
有n个长为m+1的字符串,如果某个字符串的最后m个字符与某个字符串的前m个字符匹配,则两个字符串可以联接,问这n个字符串最多可以连成一个多长的字符串,如果出现循环,则返回错误。
|
||||
|
||||
|
||||
|
||||
|
||||
#### 字符串的集合合并
|
||||
## 字符串的集合合并
|
||||
|
||||
给定一个字符串的集合,格式如:{aaa bbb ccc}, {bbb ddd},{eee fff},{ggg},{ddd hhh}要求将其中交集不为空的集合合并,要求合并完成后的集合之间无交集,例如上例应输出{aaa bbb ccc ddd hhh},{eee fff}, {ggg}。
|
||||
|
||||
|
||||
|
||||
|
||||
#### 编写strcpy 函数
|
||||
## 编写strcpy 函数
|
||||
|
||||
已知strcpy 函数的原型是:
|
||||
```
|
||||
|
||||
Reference in New Issue
Block a user