九度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记住了行数,每次求一遍确实浪费时间

时间: 2024-09-30 19:52:07

九度oj 题目1283:第一个只出现一次的字符的相关文章

九度oj 题目1007:奥运排序问题

九度oj 题目1007:奥运排序问题   恢复 题目描述: 按要求,给国家进行排名. 输入:                        有多组数据. 第一行给出国家数N,要求排名的国家数M,国家号从0到N-1. 第二行开始的N行给定国家或地区的奥运金牌数,奖牌数,人口数(百万). 接下来一行给出M个国家号. 输出:                        排序有4种方式: 金牌总数 奖牌总数 金牌人口比例 奖牌人口比例 对每个国家给出最佳排名排名方式 和 最终排名 格式为: 排名:排名

九度oj 题目1546:迷宫问题 (概率dp guess消元)

题目链接:点击打开链接 题目描述: 给定一个n*m的迷宫,如 S.. ..# E.E 其中,S代表开始位置,#代表不可行走的墙,E代表出口. 主人公从开始位置出发,每次等概率的随机选择下一个可以行走的位置,直到到达某一个出口为止. 现在他想知道,在这一概率事件中,它从开始位置走到某一个出口的期望步数是多少. 输入: 输入包含多组测试用例,每组测试用例由两个整数n,m(1<=n,m<=15)开始,代表迷宫的大小 接下去n行每行m个字符描述迷宫信息,具体规则如题面所述. 数据保证至少存在一个E和一

九度oj题目1009:二叉搜索树

题目描述: 判断两序列是否为同一二叉搜索树序列 输入:                        开始一个数n,(1<=n<=20) 表示有n个需要判断,n= 0 的时候输入结束. 接下去一行是一个序列,序列长度小于10,包含(0~9)的数字,没有重复数字,根据这个序列可以构造出一颗二叉搜索树. 接下去的n行有n个序列,每个序列格式跟第一个序列一样,请判断这两个序列是否能组成同一颗二叉搜索树. 输出:                        如果序列相同则输出YES,否则输出NO 样

九度oj 题目1256:找出两个只出现了一次的数字

题目描述: 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 输入: 输入的第一行包括一个整数N(1<=N<=1000). 接下来的一行包括N个整数. 输出: 可能有多组测试数据,对于每组数据, 找出这个数组中的两个只出现了一次的数字. 输出的数字的顺序为从小到大. 样例输入: 6 2 3 9 3 7 2 样例输出: 7 9 (题目中的条件 N 应该大于1)开始的想法是先排序,然后再去数数,代码如下 1 #include <cstdio>

九度oj 题目1159:坠落的蚂蚁

题目描述: 一根长度为1米的木棒上有若干只蚂蚁在爬动.它们的速度为每秒一厘米或静止不动,方向只有两种,向左或者向右.如果两只蚂蚁碰头,则它们立即交换速度并继续爬动.三只蚂蚁碰头,则两边的蚂蚁交换速度,中间的蚂蚁仍然静止.如果它们爬到了木棒的边缘(0或100厘米处)则会从木棒上坠落下去.在某一时刻蚂蚁的位置各不相同且均在整数厘米处(即1,2,3,…99厘米),有且只有一只蚂蚁A速度为0,其他蚂蚁均在向左或向右爬动.给出该时刻木棒上的所有蚂蚁位置和初始速度,找出蚂蚁A从此时刻到坠落所需要的时间. 输

九度oj 题目1391:顺时针打印矩阵

题目描述: 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10. 输入: 输入可能包含多个测试样例,对于每个测试案例, 输入的第一行包括两个整数m和n(1<=m,n<=1000):表示矩阵的维数为m行n列. 接下来的m行,每行包括n个整数,表示矩阵的元素,其中每个元素a的取值范围为(1&l

九度oj 题目1496:数列区间

题目描述: 有一段长度为n(1<=n<=1000000)的数列,数列中的数字从左至右从1到n编号.初始时数列中的数字都是0. 接下来我们会对其进行m(1<=m<=100000)次操作,每次操作都会将区间[l,r]内的所有数字都变为一个特定的数字,并且每次操作这个特定的数字都不相同. 我们可以简单的认为,第一次操作时将给定区间内的数字都变为1,第二次将给定区间内数字都变为2,第三次变为3,以此类推. 在经过m次操作完成后,要求输出该数列中,拥有相同正整数(不包括0)的最长连续区间长度

九度oj 题目1411:转圈

题目描述: 在一个有向图有n个顶点(编号从1到n),给一个起点s,问从起点出发,至少经过一条边,回到起点的最短距离. 输入: 输入包括多组,每组输入第一行包括三个整数n,m,s(1<=n<=500,0<=m<=10000,1<=s<=n),接下来有m行,每行包括三个整数a,b,c(1<=a,b<=n,1<=c<=1000),表示有一条a到b的边,长度为c. 输出: 对每组输入.输出最短距离,如果没有这个一条路径输出"help!"

九度oj 题目1153:括号匹配问题

题目描述: 在某个字符串(长度不超过100)中有左括号.右括号和大小写字母:规定(与常见的算数式子一样)任何一个左括号都从内到外与在它右边且距离最近的右括号匹配.写一个程序,找到无法匹配的左括号和右括号,输出原来字符串,并在下一行标出不能匹配的括号.不能匹配的左括号用"$"标注,不能匹配的右括号用"?"标注. 输入: 输入包括多组数据,每组数据一行,包含一个字符串,只包含左右括号和大小写字母,字符串长度不超过100.    注意:cin.getline(str,10