九度oj 题目1283:第一个只出现一次的字符
- 题目描述:
-
在一个字符串(1<=字符串长度<=10000,全部由大写字母组成)中找到第一个只出现一次的字符。
- 输入:
-
输入有多组数据
每一组输入一个字符串。
- 输出:
-
输出第一个只出现一次的字符下标,没有只出现一次的字符则输出-1。
- 样例输入:
-
ABACCDEFF AA
- 样例输出:
-
1 -1
开始的代码如下1 #include <cstdio> 2 #include <cstdlib> 3 #include <cstring> 4 5 int cnt[28]; 6 int wei[28]; 7 char temp[10002]; 8 9 int main(int argc, char const *argv[]) 10 { 11 //freopen("input.txt","r",stdin); 12 while(scanf("%s",temp) != EOF) { 13 memset(cnt, 0, sizeof(cnt)); 14 memset(wei, 0, sizeof(wei)); 15 for(int i = 0; i < strlen(temp); i++) { 16 cnt[temp[i] - 'A']++; 17 if(wei[temp[i] - 'A'] == 0) { 18 wei[temp[i] - 'A'] = i; 19 } 20 } 21 int min = 10002; 22 for(int i = 0; i < 26; i++) { 23 if(cnt[i] == 1 && wei[i] < min) { 24 min = wei[i]; 25 } 26 } 27 if(min == 10002) { 28 puts("-1"); 29 } 30 else { 31 printf("%d\n", min); 32 } 33 } 34 return 0; 35 }
这么精简的代码居然会超时,真是令我百思不得其解
后来偶然发现需要这样改
1 #include <cstdio> 2 #include <cstdlib> 3 #include <cstring> 4 5 int cnt[28]; 6 int wei[28]; 7 char temp[10002]; 8 9 int main(int argc, char const *argv[]) 10 { 11 while(scanf("%s",temp) != EOF) { 12 memset(cnt, 0, sizeof(cnt)); 13 memset(wei, 0, sizeof(wei)); 14 int len = strlen(temp); 15 for(int i = 0; i < len; i++) { 16 cnt[temp[i] - 'A']++; 17 if(wei[temp[i] - 'A'] == 0) { 18 wei[temp[i] - 'A'] = i; 19 } 20 } 21 int min = 10002; 22 for(int i = 0; i < 26; i++) { 23 if(cnt[i] == 1 && wei[i] < min) { 24 min = wei[i]; 25 } 26 } 27 if(min == 10002) { 28 puts("-1"); 29 } 30 else { 31 printf("%d\n", min); 32 } 33 } 34 return 0; 35 }
二者主要的区别在于15行,后面的代码用一个变量len记住了行数,每次求一遍确实浪费时间