九度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
", 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
", min);
32         }
33     }
34     return 0;
35 }

二者主要的区别在于15行,后面的代码用一个变量len记住了行数,每次求一遍确实浪费时间

原文地址:https://www.cnblogs.com/jasonJie/p/5770508.html