| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1083 人关注过本帖
标题:在随机产生的100个字母中找到第一个没有重复的,打印该字母及其位置。
只看楼主 加入收藏
robin254817
Rank: 1
等 级:新手上路
帖 子:7
专家分:2
注 册:2009-10-27
结帖率:100%
收藏
已结贴  问题点数:10 回复次数:9 
在随机产生的100个字母中找到第一个没有重复的,打印该字母及其位置。
#include<stdio.h>
#include<string.h>
int main()
{
    char str[100];
    int i,j;
    srand(time(NULL));

    for(i=0;i<100;i++){

        str[i]=rand()%26+97;

        printf("%2c",str[i]);
    }
    printf("\n");
    for(i=0;i<sizeof(str);i++){
        j=0;
        while(str[j]){

            if(i==j)
                j++;
            if(str[i]==str[j])
                break;
            else
                j++;
        }

        if(str[j])
            continue;
        else
            break;
    }
    if(i==100)
    printf("no one\n");
    else
    printf("%d %c \n",i,str[i]);
}
不知还有其他做法没?请大家多多指教。
搜索更多相关主题的帖子: 字母 位置 打印 随机 
2009-11-06 12:12
lijm1989
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:珠海
等 级:贵宾
威 望:12
帖 子:675
专家分:2844
注 册:2009-10-14
收藏
得分:0 
用下标来记会更好点····类似hash```
2009-11-06 12:45
玩出来的代码
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:河南新乡
等 级:贵宾
威 望:11
帖 子:742
专家分:2989
注 册:2009-10-12
收藏
得分:0 
#include<stdio.h>
#include<conio.h>
#define N 100
int main()
{
    char str[N];
    int i,j;
    srand(time(NULL));
    for(i=0;i<N;i++)
    {
        str[i]=rand()%26+97;
        printf("%2c",str[i]);
    }
    for(i=0;i<N;i++)
    {     j=0;
        while(str[++j]!=str[i]&&str[j]!='\0')if(j+1==i)j++;
        if(j>N-1)
         {
             printf("\n%c %d",str[i],i+1);
             goto end;
         }
        continue;
     }
     end: if(i==N) printf("\nno find");
     getch();
     return 0;
 }
   


[ 本帖最后由 玩出来的代码 于 2009-11-6 13:29 编辑 ]

离恨恰如春草,更行更远还生。
2009-11-06 13:07
UserYuH
Rank: 12Rank: 12Rank: 12
来 自:毅华
等 级:火箭侠
威 望:8
帖 子:720
专家分:3300
注 册:2009-8-10
收藏
得分:5 
只遍历字符串一次就可以找出了。
程序代码:
#include <stdio.h>
#include <string.h>
int main(void)
{
    char str[101]={0};
    int *a[26],b[26]={0}; /* 数组b记26个字母 */
    int i,k,n;
    srand(time(NULL));

    for(i=k=0;i<100;i++)
      {
        n=rand()%26;
        str[i]=n+97;
        if(b[n]==0)
          a[k++]=&b[n];  /* 指针a[k]指向第k次出现的字母, */
        b[n]++;          /* 出现字母增 1 */
      }
    puts(str);
    for(i=0;i<26;i++)
      if(*a[i]==1)       /* 按字母出现的顺序查找出现次数,值是 1 表示无重复 */
       {
        for(k=0;k<100;k++)/*遍历字符串找出无重复且第一次出现的字符    */
          if(str[k]==a[i]-b+97) /* 找到退出                         */
            break;
        printf("%d %c \n",k+1,str[k]);/* 输出对应下标和字母 */
        break;
       }
    if(i==26)printf("NO!\n");/* 如没找到输出 NO! */
    return 0;
}

努力—前进—变老—退休—入土
2009-11-06 14:22
bccnfac
Rank: 2
等 级:论坛游民
帖 子:31
专家分:48
注 册:2009-4-14
收藏
得分:0 
回复 4楼 UserYuH
你这个不是遍历一遍,第一次生成的时候记录信息也属于一次遍历。在数组给定之后,如果你能一次遍历那就厉害了。
2009-11-06 16:39
UserYuH
Rank: 12Rank: 12Rank: 12
来 自:毅华
等 级:火箭侠
威 望:8
帖 子:720
专家分:3300
注 册:2009-8-10
收藏
得分:0 
哎……算遍历两遍,再加一遍历26字母的,这是最坏情况了。

努力—前进—变老—退休—入土
2009-11-06 16:55
bccnfac
Rank: 2
等 级:论坛游民
帖 子:31
专家分:48
注 册:2009-4-14
收藏
得分:5 
不明白你后半段程序为什么写那么烦。


#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void)
{
    char str[101]={0};
    int n,i,b[26]={0}; /* 数组b记26个字母 */
    srand(time(NULL));
   
    for(i=0;i<100;i++)
    {
        n=rand()%26;
        str[i]=n+'a';
        b[n]++;
    }
    puts(str);
    for(i=0;i<100;i++)
    {
        if(b[str[i]-'a']==1)       /* 按字母出现的顺序查找出现次数,值是 1 表示无重复 */
        {
            printf("%d %c \n",i+1,str[i]);/* 输出对应下标和字母 */
            break;
        }
    }
    if(i>=100)printf("NO!\n");/* 如没找到输出 NO! */
    return 0;
}
2009-11-06 16:57
lijm1989
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:珠海
等 级:贵宾
威 望:12
帖 子:675
专家分:2844
注 册:2009-10-14
收藏
得分:0 
LS正解···偶初学者···和我想一块去了······
2009-11-06 17:04
UserYuH
Rank: 12Rank: 12Rank: 12
来 自:毅华
等 级:火箭侠
威 望:8
帖 子:720
专家分:3300
注 册:2009-8-10
收藏
得分:0 
回复 7楼 bccnfac
嗯,改得很简洁,我思路多了一重。

努力—前进—变老—退休—入土
2009-11-06 17:17
UserYuH
Rank: 12Rank: 12Rank: 12
来 自:毅华
等 级:火箭侠
威 望:8
帖 子:720
专家分:3300
注 册:2009-8-10
收藏
得分:0 
再改一下:
程序代码:
#include <stdio.h>
#include <string.h>
int main(void)
{
    char str[101]={0};
    int a[26]={0},b[26]={0};                   /* 数组a记下标,数组b记26个字母          */
    int i,n;
    srand(time(NULL));

    for(i=0;i<100;i++)                        /* 随机产生100个字母,累记出现次数并记下下标 */
      {
        n=rand()%26;
        str[i]=n+'a';
        b[n]++;
        a[n]=i;
      }
    puts(str);

    if(b[0]!=1)
      b[0]=1,a[0]=100;

    for(i=1;i<26;i++)                       /* 找出出现次数为1的最小下标 */
      if(b[i]==1)
       {
        if(a[0]>a[i])a[0]=a[i];
       }

    if(a[0]!=100)                           /* 找到                           */
      printf("%d %c \n",a[0]+1,str[a[0]]);
    else
      printf("NO!\n");                      /* 没找到                          */

    return 0;
}


努力—前进—变老—退休—入土
2009-11-06 18:15
快速回复:在随机产生的100个字母中找到第一个没有重复的,打印该字母及其位置。
数据加载中...
 
   



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

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