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

    科技2025-06-25  6

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

    题目描述

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

    表现形式可以仅是小写字母,例如,“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; }
    Processed: 0.012, SQL: 8