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

Posted expedition

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了找第一个只出现一次的字符相关的知识,希望对你有一定的参考价值。

题目地址

技术图片

 

 

方法一:

#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

 

以上是关于找第一个只出现一次的字符的主要内容,如果未能解决你的问题,请参考以下文章

C++信奥赛题目——第一个只出现一次的值

第一个只出现一次的字符位置

最强解析面试题:第一个只出现一次的字符

最强解析面试题:第一个只出现一次的字符

第一个只出现一次的字符

第一个只出现一次的字符位置-剑指Offer