• 781. 趣味字母卡片


    题目描述

    小明给儿子小小明买了一套英文字母卡片(总共包含52张,区分大小写),小小明把卡片丢在地上玩耍,并从中取出若干张排成一排,形成了一个卡片序列。

    此时,小明需要将卡片序列中的重复字母剔除(同一个字母的大小写只保留一个)。

    请问,所有可能的结果中,字母序最小(不区分大小写)的序列的第一张卡片上是哪个字母?

    输入格式

    共一行,包含一个非空字符串,表示卡片序列,长度为N。

    输出格式

    共一行,包含一个字母(如果结果是大写字母,则需要转换成小写)。

    数据范围

    1≤N≤52

    输入样例:

    xaBXY

    输出样例:

    a

    样例解释

    剔除完后的结果是abxy。

    思路

    双指针扫描

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstdlib>
     4 
     5 using namespace std;
     6 int num[27];//记录每个字母的卡片数(a-97, A-65)
     7 string s;
     8 
     9 int main() {
    10     cin>>s;
    11     int len=s.length();
    12     for(int i=0; i<len; i++) {
    13         if(s[i]<'a') s[i]+=32;//若是大写,则改为小写 
    14         num[s[i]-'a']++;
    15     }
    16     int p1=0, p2=1;
    17     while(p2<len) {
    18         if(num[s[p1]-'a']==1) break;//若s[p1]卡片只有一张,那么跳出循环
    19         if(s[p1]<=s[p2] && num[s[p2]-'a']>1) {//若s[p2]更大且数量>1,则删除卡片p2
    20             num[s[p2]-'a']--;
    21             p2++;
    22         }
    23         else if(s[p1]>s[p2] && num[s[p1]-'a']>1) {//若s[p1]更大且数量>1,则删除卡片p1
    24             num[s[p1]-'a']--;
    25             p1=p2;
    26             p2++;
    27         }
    28         else break;//若s[p2]卡片只有一张且s[p1]>s[p2],则跳出循环
    29     }
    30     cout<<s[p1]<<endl;
    31     return 0;
    32 }
  • 相关阅读:
    火星A+B
    分西瓜(DFS)
    H.数7(模拟)
    镜像树(dfs)
    锐雯上单不给就送(矩阵快速幂)
    STL容器
    优先队列(和fence repair完全一样)
    x位全排列(next_permutation)
    fence repair(队列水过)
    线段相交
  • 原文地址:https://www.cnblogs.com/wwqzbl/p/13692818.html
Copyright © 2020-2023  润新知