📜  门| GATE IT 2006 |问题21(1)

📅  最后修改于: 2023-12-03 15:42:14.106000             🧑  作者: Mango

门 | GATE IT 2006 | 问题21

问题简介

本题为GATE IT 2006年考试中的一道编程题。给定一个字符串S和两个整数p和q,要求将S划分为若干个不超过q个字符的子串,并在每个子串前添加一个长度不超过p的数字序号。要求编号间用分隔符分开,最多允许p个数字,且每个数字都不能超过9个字符。如有特殊字符需要转义。编写程序实现功能并返回结果。

输入格式

输入共三行,第一行为字符串长度N($1 \le N \le 1000$),第二行为字符串S,第三行为两个整数p和q($1 \le p,q \le 10$)。

输出格式

输出按要求格式处理后的字符串。

样例输入
28
This is a sample input file.
2 5
样例输出
01_This_ is a_
02_sampl_ e inp_
03_ut fi_ le.
解题思路
  1. 定义变量i,j,num,count,分别表示当前扫描到的字符下标、当前子串中未添加数字的字符长度、当前子串的编号、当前数字长度。
  2. 遍历字符串S,对于每个字符,判断是否为分隔符或数字。若字符为分隔符,则将前面的子串加上编号并输出,然后从下一个字符开始再次计数;若字符为数字,则按规定长度输出即可。
  3. 最后,如果剩下的子串长度不足q,也需要添加序号并输出。
代码实现
def add_number(s, p, q):
    num = 0
    count = 0
    i = 0
    res = ''
    while i < len(s):
        if s[i] == ' ' or s[i] == '.' or s[i] == ',' or s[i] == ';':
            if count > q:
                res += '\n'
                num += 1
                count = 0
            res += '{:02d}_{}\n'.format(num, s[i-count:i])
            count = 0
        elif s[i].isdigit():
            if count == 0:
                res += '{:02d}_'.format(num)
            res += s[i]
            count += 1
            if count == p:
                res += '\n'
                count = 0
        else:
            if count > q:
                res += '\n'
                num += 1
                count = 0
            res += '{:02d}_{}\n'.format(num, s[i-count:i+1])
            count = 0
        i += 1
    if count > 0:
        res += '{:02d}_{}\n'.format(num, s[i-count:])
    return res

复杂度分析

遍历字符串S一次,时间复杂度为O(N);空间复杂度为O(N),主要消耗在输出字符串上。整体复杂度较低。