我正在尝试创建一个递归函数,该函数从字符串中删除连续的重复字符。除前几个字符外,它工作正常。例如,如果我的输入是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;
}
答案 0 :(得分:1)
我是这样做的:
#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|
答案 1 :(得分:1)
您在这里。
#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
答案 2 :(得分:0)
谢谢大家的帮助。正如您所说,我在纸上浏览了我的代码,并意识到问题在于它没有比较第一个和最后一个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;
}
答案 3 :(得分:0)
我在这里只是添加了递归函数(语言:C ++),而不是整个代码。
void removeConsecutiveDuplicates(char input[]) {
if(input[0] == '\0' || input[1]=='\0') return;
if(input[0]!=input[1]) return removeConsecutiveDuplicates(input+1);
else
{
for(int i=1;i<=strlen(input);i++)
{
input[i-1] = input[i];
}
return removeConsecutiveDuplicates(input);
}
return;
}
答案 4 :(得分:-1)
我认为递归太复杂了。
让我们从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