【问题标题】:Repeated character in a string字符串中的重复字符
【发布时间】:2015-03-16 05:35:24
【问题描述】:

我正在编写一个代码来删除字符串中重复出现的字符。

说明:- 去除字符串中的重复字符

示例:-

示例输入 = 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;      
}

请告诉我这段代码哪里出了问题...?

【问题讨论】:

  • 你不能对你拥有的东西进行排序以避免两个 for 循环吗?
  • 你到底要我做什么?
  • 如果不阅读代码,我猜你没有删除重复的最后一个字符。
  • 是的,这正是正在发生的事情:/
  • reducing the size of the source array itself...好吧,至少按照目前的代码,你不是。它的大小总是等于 60 chars。

标签: c arrays string loops


【解决方案1】:

逻辑错误在块中

 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;
 }    

【讨论】:

  • R sahu 非常感谢你,你就像救世主一样救了我 :) 非常感谢
【解决方案2】:

对于我来说,我会使用指针编写相应的函数。例如

#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;
}

【讨论】:

  • 但是我不能对上面的代码进行一些更改以使其工作......?
【解决方案3】:
#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;
}

【讨论】:

  • @Patel :您的“ n ”将数组都减 1,即 i 和 j。
  • 什么!发生了什么..?
【解决方案4】:

@Patel:你的程序是正确的。 你只错过了一件事。 当你使用 printf() 时,你会减少 n 的值。

所以在 printf() 之后放一行来增加它

++i;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-09
    • 2023-03-15
    • 1970-01-01
    • 2010-09-12
    • 2017-02-15
    • 2011-10-10
    相关资源
    最近更新 更多