找第一个只出现一次的字符
方法一:
#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