帮忙看下代码和算法,哪里不对?谢了。

时间:2022-12-24 10:40:24
记不清是在哪个网站看到一个问题:有字符串:“aabbccddeeffgg”。反正就一个字符串,把里面字符相同的全部删除,然后输出删除后的字符串和删除了多少个字符的数目。如上面的字符就输出"abcdefg",和7。
我设计的算法是用一个字符指针来存储删除后的字符串。
#include<stdio.h>
int moster(char *x, char *y)
{
if(*x!='\0'&&*x!=y)   /*如果*x不是空字符和*x与y不相等那么就让y再与下x的下个字符相比*/
moster(x+1,y);
else if(*x=='\0'&&*x!=*y)
return 1;
else 
return 0;
}
void main()
{
char *ch, *p, *c, *p2;
int num=0;
printf("input a sentence:");
gets(ch);
*c='\0';
p2=c;
for(p=ch; *p!='\0'; p++)
{
if(moster(c,p))   /*如果moster函数返回了1那么就证明*p与c中存储的字符没有相同的*/
{
*p2++=*p;   /*将*p的字符赋给*p2所指向的c*/
*p2='\0';      /*因为怕这是最后一个不相同的字符所以给赋个空字符*/
}
else 
num++;     /*这是统计删除了多少个字符*/
}
printf("This is deleted same letters sentence:\n");
printf("%s\n",c);
printf("deleted %d letters.\n",num);
}

最后能运行,但结果是没有删除也没有统计数字。
各位大牛有没有更好点的算法。
我的设想,不设字符数组,因为字符数组设定了长度限制,假设不知道会输入多少个字符,也不想浪费内存。
而且有可能输入的字符每个都不一样,也有可能每个都一样。

9 个解决方案

#1


太晚了,先mark一下,明天继续。。。

#2


#include<iostream>
#include<string.h>
#include<stdio.h>
int main()
{
   char s[100],str[100];
   scanf("%s",s);
   int len=strlen(s);
   int flag[30],cnt=0;
   memset(flag,0,sizeof(flag));
   for(int i=0;i<len;i++)
   {
      if(flag[s[i]-'a']==0)
      {
         str[cnt++]=s[i];
         flag[s[i]-'a']=1;
       }
   }
    str[cnt]=0;
    printf("%s\n",str);
    return 0;
}              

假如只是小写字母 可以按上面的算法 若出现了就给flag的相对下标为1,如果有其他的也可以模仿这样来写的

#3


该回复于2012-11-13 06:09:24被管理员删除

#4


帮你看了下 修改你的了 

#include<stdio.h> 
#include<stdlib.h>
#include<string.h>
int moster(char *x, char *y)
{     
if(*x!='\0'&&*x!=*y)   /*如果*x不是空字符和*x与y不相等那么就让y再与下x的下个字符相比*/    
moster(x+1,y);   
else if(*x=='\0'&&*x!=*y)     
return 1;    
else        
return 0; 

void main() 
{     
char ch[100], *p, c[100], *p2;     //必须为字符 或者申请地址吧
int num=0;     
printf("input a sentence:");     
gets(ch);     
*c='\0';   
p2=c;    
for(p=ch; *p!='\0'; p++)    
{         
if(moster(c,p))   /*如果moster函数返回了1那么就证明*p与c中存储的字符没有相同的*/      
{           
*p2++=*p;   /*将*p的字符赋给*p2所指向的c*/    
*p2='\0';      /*因为怕这是最后一个不相同的字符所以给赋个空字符*/      
}      
else        
num++;     /*这是统计删除了多少个字符*/    
}     
printf("This is deleted same letters sentence:\n");    
printf("%s\n",c);   
printf("deleted %d letters.\n",num); 


#5


引用 4 楼 longburulin 的回复:
帮你看了下 修改你的了 


C/C++ code?



123456789101112131415161718192021222324252627282930313233343536

#include<stdio.h>  #include<stdlib.h> #include<string.h> int moster(char *x, char *y) {         ……

老兄,你这个跟没改是一样的。

#6


“不设字符数组,因为字符数组设定了长度限制,假设不知道会输入多少个字符,也不想浪费内存”
这是我听过的最强大的理由。
没错,字符数组要预估要存储的字符的最大数目,可能不能使用你预申请的全部内存。
可你直接使用字符指针,它没有申请任何内存,允许你使用的内存大小是0啊同志!!!你怕浪费,于是你一个字节都不申请?直接使用?不错那才真叫没有天理!

因为你不一定要吃几个馒头,买一堆馒头可能浪费,所以你一个都不买?等着饿死吧。

#7


引用 6 楼 baichi4141 的回复:
“不设字符数组,因为字符数组设定了长度限制,假设不知道会输入多少个字符,也不想浪费内存”
这是我听过的最强大的理由。
没错,字符数组要预估要存储的字符的最大数目,可能不能使用你预申请的全部内存。
可你直接使用字符指针,它没有申请任何内存,允许你使用的内存大小是0啊同志!!!你怕浪费,于是你一个字节都不申请?直接使用?不错那才真叫没有天理!

因为你不一定要吃几个馒头,买一堆馒头可能浪费,……

兄弟这话的意思就是必须要预申请内存空间喽。先要定义字符数组。

#8


引用 2 楼 longburulin 的回复:
C/C++ code?



12345678910111213141516171819202122

#include<iostream> #include<string.h> #include<stdio.h> int main() {    char s[100],str[100];    scanf("%s",s);    int len=strlen(s);    int f……

多谢老兄啊,下面是我根据你给的算法改了一下,可以适合所有键盘能输入的字符:
#include<stdio.h>
#include<string.h>
int main()
{
int i, len, num=0, flag[96];
char frist[100], box[100];

printf("input a sentence:");
gets(frist);
len=strlen(frist);
memset(flag,0,sizeof(flag));

for(i=0; i<len; i++)
if(flag[frist[i]-32]==0)
{
box[num++]=frist[i];
flag[frist[i]-32]=1;
}
box[num]='\0';

printf("deleted same characters %d.\n",len-num);
printf("%s\n",box);
}

#9


引用 8 楼 zhfrush200 的回复:
引用 2 楼 longburulin 的回复:
C/C++ code?



12345678910111213141516171819202122

#include<iostream> #include<string.h> #include<stdio.h> int main() {    char s[100],str[100];    scanf("%s",s);    in……
你又测试我修改你的代码么 我这边是可以的 

#1


太晚了,先mark一下,明天继续。。。

#2


#include<iostream>
#include<string.h>
#include<stdio.h>
int main()
{
   char s[100],str[100];
   scanf("%s",s);
   int len=strlen(s);
   int flag[30],cnt=0;
   memset(flag,0,sizeof(flag));
   for(int i=0;i<len;i++)
   {
      if(flag[s[i]-'a']==0)
      {
         str[cnt++]=s[i];
         flag[s[i]-'a']=1;
       }
   }
    str[cnt]=0;
    printf("%s\n",str);
    return 0;
}              

假如只是小写字母 可以按上面的算法 若出现了就给flag的相对下标为1,如果有其他的也可以模仿这样来写的

#3


该回复于2012-11-13 06:09:24被管理员删除

#4


帮你看了下 修改你的了 

#include<stdio.h> 
#include<stdlib.h>
#include<string.h>
int moster(char *x, char *y)
{     
if(*x!='\0'&&*x!=*y)   /*如果*x不是空字符和*x与y不相等那么就让y再与下x的下个字符相比*/    
moster(x+1,y);   
else if(*x=='\0'&&*x!=*y)     
return 1;    
else        
return 0; 

void main() 
{     
char ch[100], *p, c[100], *p2;     //必须为字符 或者申请地址吧
int num=0;     
printf("input a sentence:");     
gets(ch);     
*c='\0';   
p2=c;    
for(p=ch; *p!='\0'; p++)    
{         
if(moster(c,p))   /*如果moster函数返回了1那么就证明*p与c中存储的字符没有相同的*/      
{           
*p2++=*p;   /*将*p的字符赋给*p2所指向的c*/    
*p2='\0';      /*因为怕这是最后一个不相同的字符所以给赋个空字符*/      
}      
else        
num++;     /*这是统计删除了多少个字符*/    
}     
printf("This is deleted same letters sentence:\n");    
printf("%s\n",c);   
printf("deleted %d letters.\n",num); 


#5


引用 4 楼 longburulin 的回复:
帮你看了下 修改你的了 


C/C++ code?



123456789101112131415161718192021222324252627282930313233343536

#include<stdio.h>  #include<stdlib.h> #include<string.h> int moster(char *x, char *y) {         ……

老兄,你这个跟没改是一样的。

#6


“不设字符数组,因为字符数组设定了长度限制,假设不知道会输入多少个字符,也不想浪费内存”
这是我听过的最强大的理由。
没错,字符数组要预估要存储的字符的最大数目,可能不能使用你预申请的全部内存。
可你直接使用字符指针,它没有申请任何内存,允许你使用的内存大小是0啊同志!!!你怕浪费,于是你一个字节都不申请?直接使用?不错那才真叫没有天理!

因为你不一定要吃几个馒头,买一堆馒头可能浪费,所以你一个都不买?等着饿死吧。

#7


引用 6 楼 baichi4141 的回复:
“不设字符数组,因为字符数组设定了长度限制,假设不知道会输入多少个字符,也不想浪费内存”
这是我听过的最强大的理由。
没错,字符数组要预估要存储的字符的最大数目,可能不能使用你预申请的全部内存。
可你直接使用字符指针,它没有申请任何内存,允许你使用的内存大小是0啊同志!!!你怕浪费,于是你一个字节都不申请?直接使用?不错那才真叫没有天理!

因为你不一定要吃几个馒头,买一堆馒头可能浪费,……

兄弟这话的意思就是必须要预申请内存空间喽。先要定义字符数组。

#8


引用 2 楼 longburulin 的回复:
C/C++ code?



12345678910111213141516171819202122

#include<iostream> #include<string.h> #include<stdio.h> int main() {    char s[100],str[100];    scanf("%s",s);    int len=strlen(s);    int f……

多谢老兄啊,下面是我根据你给的算法改了一下,可以适合所有键盘能输入的字符:
#include<stdio.h>
#include<string.h>
int main()
{
int i, len, num=0, flag[96];
char frist[100], box[100];

printf("input a sentence:");
gets(frist);
len=strlen(frist);
memset(flag,0,sizeof(flag));

for(i=0; i<len; i++)
if(flag[frist[i]-32]==0)
{
box[num++]=frist[i];
flag[frist[i]-32]=1;
}
box[num]='\0';

printf("deleted same characters %d.\n",len-num);
printf("%s\n",box);
}

#9


引用 8 楼 zhfrush200 的回复:
引用 2 楼 longburulin 的回复:
C/C++ code?



12345678910111213141516171819202122

#include<iostream> #include<string.h> #include<stdio.h> int main() {    char s[100],str[100];    scanf("%s",s);    in……
你又测试我修改你的代码么 我这边是可以的