找到指定类型的新类型字符
题目描述
新类型字符的定义如下:
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(1≤n≤105,0≤k≤n−1),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;
}