方法一:
#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; }
兩個方向優化時間:
- strlen() 一次性算出來,不要在循環中多次計算
- 從前往后遍歷時,如果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; }
兩個方向優化時間:
- strlen() 一次性計算出來,不要放到循環中多次計算
- 利用計時器【一般是int 數組】,存入26個0,表示a-z 每個字符出現的次數,然后從前往后遍歷字符串,判定每個字符在計時器對應的位置的數值【即出現了幾次】,如果遇到為1的情況,直接輸出該字符,break結束。如果沒有,則輸出no