第一种方法:遍历原数组,在待删数组里遍历是否删除该元素
char* removeChars(char str[], const char remove[]) {
int len = strlen(str);
char *temp=new char[len];
int i = 0, j, count = 0;
bool state = true;
while (str[i] != '\0') {
for (j = 0; j < strlen(remove); ++j) {
if (str[i] == remove[j]) {
state = false;
}
}
if (state)
temp[count++] = str[i];
state = true;
i++;
}
temp[count] = '\0';
return temp;
}
第二种方法:时间复杂度O(n),先把待删数组元素映射到ASCII码数组上,直接在遍历原数组,看遍历到的元素是否在ASCII码数组上(省略了待删数组的遍历),接下来是重点(删除原数组中包含的待删数组中的元素):用两个指针(这里指数组下标,src和dst分别指向当前遍历元素和某字符最终移动到的位置),src肯定是一直前进的,dst在当前元素不在待删数组中时前进。
void removeChars1(char str[], const char remove[]){
int remaveArrays[256];
int i,src=0,dst=0;
for (i = 0; i < 256; ++i) {
remaveArrays[i] = 0;
}
for (i = 0; remove[i]!='\0'; ++i) {
remaveArrays[remove[i]] = 1;
}
// do{
// if (remaveArrays[str[src]]==0){//不要删除
// str[dst] = str[src];
// dst++;
// }
// src++;
// }while (str[src]!='\0');
while (str[src]!='\0'){
if (remaveArrays[str[src]]==0){//不要删除
str[dst] = str[src];
dst++;
}
src++;
}
str[dst] = '\0';
}