C 字符串中的重复字符
我正在编写一个代码来删除字符串中重复出现的字符 说明:-从字符串中删除重复的字符 示例:- 样本输入=abcdeabd 样本输出=abcde 我已经编写了代码,它正在工作,当我通过运行示例测试用例进行测试时,它通过了大多数测试用例,但有些测试用例失败,例如,当我将输入字符串用作“abcdabcdabcdabcdabcd”时,它将abcdd作为输出,而不是“abcd” 这是我的密码C 字符串中的重复字符,c,arrays,string,loops,C,Arrays,String,Loops,我正在编写一个代码来删除字符串中重复出现的字符 说明:-从字符串中删除重复的字符 示例:- 样本输入=abcdeabd 样本输出=abcde 我已经编写了代码,它正在工作,当我通过运行示例测试用例进行测试时,它通过了大多数测试用例,但有些测试用例失败,例如,当我将输入字符串用作“abcdabcdabcdabcdabcd”时,它将abcdd作为输出,而不是“abcd” 这是我的密码 #include<stdio.h> int main(void) { char a[
#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;
}
#包括
内部主(空)
{
字符a[60]=“abcdeabd”;
int n=0;
对于(int l=0;a[l]!='\0';++l)
++n;
printf(“%d\n”,--n);
对于(inti=0;i对于我,我将使用指针编写相应的函数
#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;
}
至于你的代码,我会按照下面的方式重写,考虑到你也要复制终止零
#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;
}
#包括
char*unique(char*s)
{
int n=0;
而(s[n++]!='\0');
printf(“%d\n”,n);
对于(int i=0;i
至于我,我会使用指针编写相应的函数
#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;
}
至于你的代码,我会按照下面的方式重写,考虑到你也要复制终止零
#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;
}
#包括
char*unique(char*s)
{
int n=0;
而(s[n++]!='\0');
printf(“%d\n”,n);
对于(int i=0;i
逻辑错误在块中
if(a[i]==a[j])
{
for(int k=j;k<=n;++k)
a[k]=a[k+1];
--n;
}
逻辑错误在块中
if(a[i]==a[j])
{
for(int k=j;k<=n;++k)
a[k]=a[k+1];
--n;
}
#包括
内部主(空)
{
字符a[10]=“abcdeabd”;
对于(int i=0;a[i]!='\0';++i)
printf(“\n%c”,a[i]);
对于(i=0;a[i]!='\0';++i)
对于(int j=i+1;a[j]!='\0';++j)
如果(a[i]==a[j])
对于(int k=j;a[k]!='\0';++k)
a[k]=a[k+1];
第(a)款;
返回0;
}
#包括
内部主(空)
{
字符a[10]=“abcdeabd”;
对于(int i=0;a[i]!='\0';++i)
printf(“\n%c”,a[i]);
对于(i=0;a[i]!='\0';++i)
对于(int j=i+1;a[j]!='\0';++j)
如果(a[i]==a[j])
对于(int k=j;a[k]!='\0';++k)
a[k]=a[k+1];
第(a)款;
返回0;
}
帕特尔:你的程序是正确的。
你只错过了一件事。
使用printf()时,会减小n的值
所以在printf()之后放一行以增加它
@帕特尔:你的程序是正确的。
你只错过了一件事。
使用printf()时,会减小n的值
所以在printf()之后放一行以增加它
为了避免两个for循环,你不能对你所拥有的进行排序吗?你到底要求我做什么?如果不阅读代码,我猜你没有删除重复的最后一个字符。是的,这就是正在发生的事情:/减小源数组本身的大小
…好吧,至少根据当前代码,你没有。这是正确的'的大小始终等于60char
s。您不能对您拥有的内容进行排序,以避免两个for循环吗?您要求我做什么?如果不阅读代码,我猜您无法删除重复的最后一个字符。是的,就是这样:/减小源数组本身的大小代码>…好吧,至少根据目前的代码,你不是。它的大小总是等于60个字符。但是我对上面的代码所做的一些更改不能仅仅是为了让它工作吗…?但是我对上面的代码所做的一些更改不能仅仅是为了让它工作吗…?R sahu谢谢你,你就像一个救世主,把我从麻烦中救了出来:)谢谢一个tonR sahu谢谢一个吨人,你就像一个救世主一样来救我脱离困境:)谢谢ton@Patel:您的“n”将数组中的i和j都减少了1。发生了什么事?@Patel:您的“n”将数组中的i和j都减少了1。发生了什么事。。?
++i;