我正在编写一个代码来删除字符串中重复出现的字符。
说明: - 从字符串中删除重复的字符
示例: -
示例输入 = abcdeabd
示例输出 = abcde
我已经编写了代码并且它正在运行,当我通过运行示例测试用例进行测试时,它正在通过大多数测试用例但是失败了一些例如当我使用输入字符串为“abcdabcdabcdabcd”它给我abcdd作为输出而不是“abcd”
这是我的代码
#include<stdio.h>
int main(void)
{
char a[60]="abcdeabd";
int n=0;
for(int l=0;a[l]!='\0';++l)
++n;
printf("%d\n",--n);
for(int i=0;i<=n;++i)
{
for(int j=i+1;j<=n;++j)
{
if(a[i]==a[j])
{
for(int k=j;k<=n;++k)
a[k]=a[k+1];
--n;
}
}
}
puts(a);
return 0;
}
请告诉我这段代码出了什么问题......?
答案 0 :(得分:3)
逻辑错误在块
中 if(a[i]==a[j])
{
for(int k=j;k<=n;++k)
a[k]=a[k+1];
--n;
}
当你连续两次拥有相同的角色时,它不起作用。它不适用于“addd”或“adddbc”。
将其更改为while
循环以解决问题。
while (a[i] == a[j])
{
for(int k=j;k<=n;++k)
a[k]=a[k+1];
--n;
}
答案 1 :(得分:1)
对于我,我会使用指针编写相应的函数。例如
#include <stdio.h>
char * unique( char *s )
{
char *last = s, *current = s;
do
{
char *t = s;
while ( t != last && *t != *current ) ++t;
if ( t == last )
{
if ( last != current ) *last = *current;
++last;
}
} while ( *current++ );
return s;
}
int main(void)
{
char s[]="abcdeabd";
puts( s );
puts( unique( s ) );
return 0;
}
输出
abcdeabd
abcde
至于你的代码,我会按照以下方式重写它。考虑到你必须复制终止零。
#include <stdio.h>
char *unique( char *s )
{
int n = 0;
while ( s[n++] != '\0' );
printf( "%d\n", n );
for ( int i = 0; i < n; ++i )
{
for ( int j = i + 1; j < n; ++j )
{
if ( s[i] == s[j] )
{
--n;
for ( int k = j; k < n; ++k ) s[k] = s[k+1];
}
}
}
return s;
}
int main(void)
{
char s[]="abcdeabd";
puts( s );
puts( unique( s ) );
return 0;
}
答案 2 :(得分:0)
#include<stdio.h>
int main(void)
{
char a[10]="abcdeabd";
for(int i=0;a[i]!='\0';++i)
printf("\n %c", a[i]);
for(i=0;a[i]!='\0';++i)
for(int j=i+1;a[j]!='\0';++j)
if(a[i]==a[j])
for(int k=j;a[k]!='\0';++k)
a[k]=a[k+1];
puts(a);
return 0;
}
答案 3 :(得分:0)
@Patel:你的程序是正确的。 你只错过了一件事。 使用printf()时,会减小n的值。
所以在printf()
之后添加一行来增加它++i;