NOJ - T051
[編輯] [转简体] (简体译文)概要
字符串切片
正文
字符串切片
Time Limit: 1000ms, Memory Limit: 10000KB , Accepted: 0, Total Submissions: 0
VIDEO1
Description
Python允许对字符串做“切片”操作,通过s [ start : stop : step ] 这样的运算实现。它表示从start开始(包含start),每次步长step(增量),直到stop停止(不包含stop),逐个提取字符串s的字符。s的下标可以是正的,从零开始;也可以是负的,从-1开始。-1下标的字符是该字符串最后一个字符,然后往前数,如下图所示。
如果S字符串为“ABCDEFGHI”,则有下面的运算及结果。
(1)S[2:7]得到“CDEFG”,如果不提供step,则step默认为1。
(2)S[-7:-2]得到“CDEFG”,start和stop可以同时为负值。参考上图。
(3)S[2:-5]得到“CD”,start和stop可以一个为负值。参考上图。
(4)S[2:7:2]得到“CEG”,step为2,正序间隔提取字符。
(5)S[6:1:-2]得到“GEC”,step为-2,倒序间隔提取字符。
(6)S[:3]得到“ABC”,start不提供默认从0开始,step默认为1。
(7)S[6:]得到“GHI”,stop不提供默认为字符串末尾结束,step默认为1。
(8)S[::-1]得到“IHGFEDCBA”,特例,不提供start和stop,step为-1,反序提取全部字符。
编写一个切片函数,void str_slice(char dest[], char src[], int start, int stop, int step); 将源字符串src的字符按上述规律提取到dest新字符串中。
Input
在第一行里输入一个源字符串src,第二行输入一个整数T,表示测试用例数目。接下来的T行,每行输入参数个数n、起始start、结束stop、步长step。当n为3,后面输入start、stop、step,n为2,后面输入start、stop(此时step默认为1),n为1,后面输入start(此时stop默认为字符串长度、step默认为1)。输入数据保证有意义。
Output
针对每个测试用例,输出字符串切片的结果。
Sample Input
ABCDEFGHI
8
2 2 7
2 -7 -2
2 2 -5
3 2 7 2
3 6 1 -2
2 0 3
1 6
3 -1 -10 -1
Sample Output
CDEFG
CDEFG
CD
CEG
GEC
ABC
GHI
IHGFEDCBA
#include <stdio.h> #include <string.h> void str_slice(char dest[], char src[], int start, int stop, int step) { if (start < 0) { start += strlen(src); } if (stop < 0) { stop += strlen(src); } for (int i = start, j = 0; ; i += step, j++) { if ((step > 0 && i >= stop) || (step < 0 && i <= stop)) { break; } dest[j] = src[i]; } } int main() { int T; char src[1024] = { 0 }; scanf("%s", src); scanf("%d", &T); char dest[T][1024] = { 0 }; for (int i=0; i < T; i++) { int n, start = 0, stop = strlen(src), step = 1; scanf("%d", &n); switch (n) { case 1: scanf("%d", &start); break; case 2: scanf("%d%d", &start, &stop); break; case 3: scanf("%d%d%d", &start, &stop, &step); break; } str_slice(dest[i], src, start, stop, step); } for (int i=0; i < T; i++) { printf("%s\n", dest[i]); } return 0; }