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

  • 相关阅读:
    【C#/WPF】限制GridSplitter分隔栏的滑动范围
    【C#】访问泛型中的List列表数据
    【C#学习笔记】反射的简单用法
    【C#】获取泛型<T>的真实类型
    【Unity】关于发射子弹、导弹追踪的逻辑
    【转】【Unity】四元数(Quaternion)和旋转
    【Unity】UGUI的Text各种小问题
    【火狐FireFox】同步失败后,书签被覆盖,如何恢复书签
    【转】【Unity】实现全局管理类的几种方式
    【Unity】动态调用其他脚本的函数
  • 原文地址:https://www.cnblogs.com/jasonJie/p/5770508.html
Copyright © 2011-2022 走看看