找第一個只出現一次的字符


題目地址

 

 

方法一:

#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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM