| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3132 人关注过本帖
标题:C語言 還有其他方式 做出 刪除重複?
只看楼主 加入收藏
adssc
Rank: 2
等 级:论坛游民
威 望:1
帖 子:61
专家分:32
注 册:2018-4-20
收藏
得分:0 
回复 10楼 李晨经纪人
迴圈裡面的精華不太懂,能請大大勞心解釋一下  
2018-04-21 19:21
adssc
Rank: 2
等 级:论坛游民
威 望:1
帖 子:61
专家分:32
注 册:2018-4-20
收藏
得分:0 
回复 10楼 李晨经纪人
#include<stdio.h>
#include<stdlib.h>
int main()
{
    char A[100];
    int B[100]={0},i,j;
    printf("input:");
    gets(A);
    i=0;
    j=0;
    while(i<100)
    {
        if(A[i]=='\0')
            break;
        if(B[A[i]]==0)
        {
            B[(A[i])]++;
            A[j++]=A[i];
        }
        i++;
    }
    A[j]='\0';
    puts(A);
    system("pause");
    return 0;
}
我把迴圈改成while,但第2個條件判斷不太懂
         if(B[A[i]]==0)
        {
            B[(A[i])]++;
            A[j++]=A[i];
        }
大大能寫的詳細一點,感覺有點簡化了,哈哈!! 麻煩大大
2018-04-21 19:31
李晨经纪人
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:6
帖 子:175
专家分:848
注 册:2018-2-14
收藏
得分:0 
if(B[A[i]]==0)                //如果A[i]这个字符之前没出现过
{
     B[(A[i])]++;              // B[(A[i])]+1表示出现了一次
     A[j++]=A[i];              //相当于A[j]=A[i];j++;
}
2018-04-21 19:47
adssc
Rank: 2
等 级:论坛游民
威 望:1
帖 子:61
专家分:32
注 册:2018-4-20
收藏
得分:0 
回复 13楼 李晨经纪人
謝謝大大,有點懂了,我稍微改了一些如下
#include<stdio.h>
#include<stdlib.h>
int main()
{
    char A[100];
    int B[100]={0},i,j;
    printf("input:");
    gets(A);
    i=0;
    j=0;
    while(A[i]!='\0')
    {
        if(A[i]=='\0')
            break;
        if(B[A[i]]==0)
        {
            B[(A[i])]++;
            A[j]=A[i];
            j++;
        }
        i++;
    }
    A[j]='\0';
    puts(A);
    system("pause");
    return 0;
}
這段條件判斷
          if(B[A[i]]==0)
          {
            B[(A[i])]++;
第一次看到這樣寫,可以勞煩大大,拆解還是只能這樣寫呢?  不好意思,一直麻煩你,不厭其煩教導,謝謝
2018-04-21 21:10
李晨经纪人
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:6
帖 子:175
专家分:848
注 册:2018-2-14
收藏
得分:0 
不用客气,这两个写法都一样我13楼注释写了。我也菜鸟,不要叫我大大,会不好意思。我只是比别人话多
2018-04-21 21:41
adssc
Rank: 2
等 级:论坛游民
威 望:1
帖 子:61
专家分:32
注 册:2018-4-20
收藏
得分:0 
回复 15楼 李晨经纪人
這段條件判斷
          if(B[A[i]]==0)
          {
            B[(A[i])]++;
可以如何拆解還是只能這樣寫呢...?
2018-04-21 22:05
xzlxzlxzl
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:湖北
等 级:贵宾
威 望:125
帖 子:1091
专家分:5825
注 册:2014-5-3
收藏
得分:5 
冒个泡参乎下,下述代码和题主一楼代码思路接近,只不过题主代码是正向搜不重复字符,我的代码是反向,该代码适用于数据量小的字符串,对于串长过万的则效率低。串长过千了建议使用二楼答主开数组打asc字符标志的算法,那个效率应该是O(n)。
程序代码:
#include<stdio.h> 
#include<stdlib.h> 
main() 
{ 
    char A[100]; 
    int i,j,k; 
    printf("input:"); 
    gets(A);
    for(i=j=0;A[i];i++)
    {
        for(k=i-1;k>=0&&A[i]!=A[k];k--);  //反向搜当前字符是否在过去有重复
        if(k<0)A[j++]=A[i];               //无重复则回填到原数组中
    }
    A[j]=0;
    puts(A); 
    system("pause"); 
} 
2018-04-21 22:24
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
回复 17楼 xzlxzlxzl
话说正向和反向搜索有什么区别么,总体效率是一样的吧?~
感觉平均时间复杂度应该是一样的~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2018-04-21 22:38
xzlxzlxzl
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:湖北
等 级:贵宾
威 望:125
帖 子:1091
专家分:5825
注 册:2014-5-3
收藏
得分:0 
回复 18楼 九转星河
我都说了思路差不多,只是按题主要求简化下代码而已。
我说效率高是针对6楼答主那种开数组打asc码标的算法的。
2018-04-21 22:47
adssc
Rank: 2
等 级:论坛游民
威 望:1
帖 子:61
专家分:32
注 册:2018-4-20
收藏
得分:0 
回复 19楼 xzlxzlxzl
感謝大大提供,小弟的思路不好,目前功力無法體會= = 哈哈
2018-04-21 22:51
快速回复:C語言 還有其他方式 做出 刪除重複?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.015642 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved