我正在尝试创建一个递归函数,该函数从字符串中删除连续的重复字符。除前几个字符外,它工作正常。例如,如果我的输入是MMMMMuuuuuOOOOOKKKKLLLEE OOOOLLL
或类似的东西,则输出是MMuOKLE OL
。如您所见,除了前两个M之外,它都能正常工作。我如何也可以在第一部分中完成这项工作?这是我的代码:
#include <stdio.h>
char* remove_duplicates (char* str){
if(*(str+1)!='\0'){
if(*str==*(str+1)){
*(str+1)=*(str+2);
remove_duplicates(str+1);
}
remove_duplicates(str+1);
}
return str;
}
int main()
{
char sample[] = "MMMMMuuuuuOOOOOKKKKLLLEE OOOOLLL";
printf("OLD: |%s|\n", sample);
printf("NEW: |%s|\n", remove_duplicates(sample));
return 0;
}
您在这里。
#include <stdio.h>
char * remove_duplicates( char *s )
{
if ( *s )
{
if ( *s == *( s + 1 ) )
{
*( s + 1 ) = *( s + 2 );
remove_duplicates( s + 1 );
remove_duplicates( s );
}
else
{
remove_duplicates( s + 1 );
}
}
return s;
}
int main(void)
{
char s[] = "MMMMMuuuuuOOOOOKKKKLLLEE";
remove_duplicates( s );
puts( s );
return 0;
}
程序输出为
MuOKLE
谢谢大家的帮助。正如您所说,我在纸上浏览了我的代码,并意识到问题在于它没有比较第一个和最后一个M。我添加了一个新的if语句if(*str==*(str-1)) *(str)=*(str+1);
,它现在可以工作。
现在的功能是:
char* remove_duplicates (char* str){
if(*(str+1)!='\0'){
if(*str==*(str+1)){
*(str+1)=*(str+2);
remove_duplicates(str+1);
}
remove_duplicates(str+1);
}
if(*str==*(str-1)) *(str)=*(str+1);
return str;
}
我是这样做的:
#include <stdio.h>
char* remove_duplicates(char* str)
{
if (*str)
{
char* dest = remove_duplicates(str + 1);
str = (*str == *dest) ? dest : ((*(dest - 1) = *str), (dest - 1));
}
return str;
}
int main()
{
char sample[] = "MMMMMuuuuuOOOOOKKKKLLLEE OOOOLLL";
char sample2[] = "AA";
printf("OLD: |%s|\n", sample);
printf("NEW: |%s|\n", remove_duplicates(sample));
printf("OLD: |%s|\n", sample2);
printf("NEW: |%s|\n", remove_duplicates(sample2));
return 0;
}
OLD: |MMMMMuuuuuOOOOOKKKKLLLEE OOOOLLL|
NEW: |MuOKLE OL|
OLD: |AA|
NEW: |A|
我认为递归太复杂了。
让str
的开头以2个光标开头>
首先在字符串上循环。当我们没有到达字符串的末尾*p
时,请期待p++
while (*p++) { if (*p == *current) continue;
如果下一个字符与当前字符相同,则继续搜索下一个不同的字符。
current++; *current = *p;
当找到另一个字符时,将其放在当前字符之后。
#include <stdio.h> char* remove_duplicates (char* str){ char *p = str; char *current = p; while (*p++) { if (*p == *current) continue; current++; *current = *p; } return str; } int main() { char sample[] = "MMMMMuuuuuOOOOOKKKKLLLEE OOOOLLL"; printf("OLD: |%s|\n", sample); printf("NEW: |%s|\n", remove_duplicates(sample)); printf("NEW: |%s|\n", remove_duplicates("")); return 0; } OLD: |MMMMMuuuuuOOOOOKKKKLLLEE OOOOLLL| NEW: |MuOKLE OL| NEW: ||
带有
AAAB
的详细信息当前的c
p v AAAB0 ^ c p v AAAB0 ^ c p v AAAB0 ^ c p v ABAB0 ^ c p v ABAB0 ^ c p v ABAB0 ^ c p v AB0B0 ^ c
我们得到
AB