zoukankan      html  css  js  c++  java
  • 九度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记住了行数,每次求一遍确实浪费时间

  • 相关阅读:
    Python 面向对象高级编程
    Python 继承和多态
    Python 访问限制
    学习笔记项目3-Django-管理网站
    学习笔记项目2-Django-创建数据库及应用
    学习笔记项目1-Django-创建虚拟环境和项目
    写一个 100 以内的奇数列表
    给一个字符串,转换成数字整数,若包含非法字符,返回提示,正确则反回整数值,不能使用内置函数转换
    Linux系统实现一个everything程序
    自动化测试常用脚本-等待某个元素是否显示
  • 原文地址:https://www.cnblogs.com/jasonJie/p/5770508.html
Copyright © 2011-2022 走看看