码迷,mamicode.com
首页 > 其他好文 > 详细

找第一个只出现一次的字符

时间:2019-09-21 12:34:37      阅读:59      评论:0      收藏:0      [点我收藏+]

标签:int   return   span   地址   blank   ima   计时器   循环   技术   

题目地址

技术图片

 

 

方法一:

#include<stdio.h>
#include<string.h>
char a[100005];

int main(){
    int f = 0;
    scanf("%s" , a);
    int ll = strlen(a);
    for(int i = 0;i < ll;i++){
        int x = 0;
        if(a[i] == *)
            continue;
        for(int j = i+1;j < ll;j++){
            if(a[j] == *)
                continue;
            if(a[i] == a[j])
                {
                    x= 1;
                    a[j] = *;
                    continue;
                }
        }
        if(x == 0){
            printf("%c",a[i]);
            f = 1;
            break;
        }

    }
    if(f == 0)
        printf("no");
    return 0;
}

两个方向优化时间:

  1. strlen()  一次性算出来,不要在循环中多次计算
  2. 从前往后遍历时,如果a[i ]== a[j],可以令a[j ] = ‘*‘ ,特殊字符作为标志,这样,如果后面的循环中遇到 a[i] = ‘*‘ 【外层循环】 和 a[j] = ‘*‘ 【内层循环】 的情况,完全可以直接跳过该轮循环,优化时间

 

方法二:

#include<stdio.h>
#include<string.h>
int a[26];
char b[100005];
int main(){
    memset(a,0,sizeof(a));
    char c;
    int i = 0;
    int f =0;
    scanf("%s",b);
    int bl = strlen(b);
    for(int i =0;i < bl;i++){
        int x = b[i] - 97;
        a[x] = a[x] + 1;
    }

    for(int i =0; i < bl;i++){
        int x = b[i] - 97;
        if(a[x] == 1){
            printf("%c",b[i]);
            f = 1;
            break;
        }
    }
    if(f == 0)
        printf("no");
    return 0;
}

两个方向优化时间:

  1. strlen()  一次性计算出来,不要放到循环中多次计算
  2. 利用计时器【一般是int 数组】,存入26个0,表示a-z 每个字符出现的次数,然后从前往后遍历字符串,判定每个字符在计时器对应的位置的数值【即出现了几次】,如果遇到为1的情况,直接输出该字符,break结束。如果没有,则输出no

 

找第一个只出现一次的字符

标签:int   return   span   地址   blank   ima   计时器   循环   技术   

原文地址:https://www.cnblogs.com/expedition/p/11562191.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!