Files
Learn-Algorithms/9 Algorithms Job Interview/1.2 字符串-删除.md
T
2021-09-09 00:21:07 +08:00

72 lines
1.7 KiB
Markdown

# 字符串-删除
### 删除串中指定的字符
删除指定的字符以后,后面的字符都要向前移动一位。这种复杂度是O(N^2);那么有没有O(N)的方法呢?
比如 "abcdeccba" 删除字符 "c"。使用2个指针,一前一后,比较前面的指针和删除字符:
1. 不相等,两个指针一起跑,且前面的指针值拷贝到后面指针指向的空间
2. 相等时,快指针向前一步
```
char *delete_occurence_character(char *src , char target){
char *front = src;
char *rear = src;
while(*front != '\0'){
if (*front != target){
*rear = *front;
rear++;
}
front++;
}
*rear = '\0';
return src;
}
```
### 在字符串中删除特定的字符
题目:输入两个字符串,从第一字符串中删除第二个字符串中所有的字符。例如,输入”They are students.”和”aeiou”,则删除之后的第一个字符串变成”Thy r stdnts.”。
这是上个题目的升级版本。
```
char *delete_occurence_characterset(char *source,const char *del);
```
1. 蛮力法。 遍历字符串,每个字符去删除字符串集合中查找,有就删除
2. 使用上面的方式,一次遍历
### 删除字符串中的数字并压缩字符串
如字符串”abc123de4fg56”处理后变为”abcdefg”。注意空间和效率。(下面的算法只需要一次遍历,不需要开辟新空间,时间复杂度为O(N))
这道题跟上一道题也是一个意思。
示例代码:
```
char *trim_number(char *source){
char *start = source;
char *end = source;
if (source == NULL) return NULL;
while(*end != '\0'){
if (*end < '0' || *end > '9' ){
*start = *end;
start++;
}
end++;
}
*start = '\0';
return source;
}
```