找到指定类型的新类型字符

找到指定类型的新类型字符

题目描述

新类型字符的定义如下:
1.新类型字符是长度为1或者2的字符串。

  1. 表现形式可以仅是小写字母,例如,“e”; 也可以是大写字母+小写字母,例如,“Ab”;还可以是大写字母+大写字母,例如,“DC”。

现在给定一个字符串str, str 一定是若干新类型字符 正确组合的结果。比如"eaCCBi",由新类型字符"e"、"a”、"CC"和"Bi"拼成。 再给定一个整数k,代表str中的位置。请返回第k个位置的新类型字符。

输入描述:

输入包含两行,第一行两个整数 n , k ( 1 ≤ n ≤ 1 0 5 , 0 ≤ k ≤ n − 1 ) n,k(1 \leq n \leq 10^5,0 \leq k \leq n-1) n,k(1n105,0kn1),n代表字符串str的长度,第二行包含一个字符串,代表字符串str。

输出描述:

输出包含一个被k位置指定的新型字符。

示例1
输入
11 7
aaABCDEcBCg
输出
Ec

题解:

字符串模拟。基础解法是从前往后遍历,到了k位置就知道是什么字符了。有另一种新颖点的做法,从k-1位置开始往左遍历,遇到第一个小写字母停止,统计大写字母的个数 num :

  • 若 num 为奇数,则新类型字符必定为 str[k-1,k];
  • 若 str[k] 为大写字母,则新类型字符为 str[k,k+1];
  • 否则的话,新类型字符为 str[k]。

注意:题目中的 k 是从0开始的。

代码:
#include <cstdio>
#include <cstring>

using namespace std;

const int N = 100010;

char s[N];
int n, k;

int main(void) {
    
    
    scanf("%d%d", &n, &k);
    scanf("%s", s);
    int ans = 0;
    for (int i = k - 1; i >= 0; --i) {
    
    
        if (s[i] >= 'a' && s[i] <= 'z') break;
        ++ans;
    }
    if (ans & 1) printf("%c%c\n", s[k - 1], s[k]);
    else if (s[k] >= 'A' && s[k] <= 'Z') printf("%c%c\n", s[k], s[k + 1]);
    else printf("%c\n", s[k]);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/MIC10086/article/details/108961760