python ccf题解 201803-3 URL映射

本文介绍了一个简单的URL映射功能实现,通过解析HTTP请求中的URL地址并分派给相应处理代码,涉及字符串、整数和路径参数的匹配。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述

试题编号:201803-3
试题名称:URL映射
时间限制:1.0s
内存限制:256.0MB
问题描述:

问题描述

  URL 映射是诸如 Django、Ruby on Rails 等网页框架 (web frameworks) 的一个重要组件。对于从浏览器发来的 HTTP 请求,URL 映射模块会解析请求中的 URL 地址,并将其分派给相应的处理代码。现在,请你来实现一个简单的 URL 映射功能。
  本题中 URL 映射功能的配置由若干条 URL 映射规则组成。当一个请求到达时,URL 映射功能会将请求中的 URL 地址按照配置的先后顺序逐一与这些规则进行匹配。当遇到第一条完全匹配的规则时,匹配成功,得到匹配的规则以及匹配的参数。若不能匹配任何一条规则,则匹配失败。
  本题输入的 URL 地址是以斜杠 / 作为分隔符的路径,保证以斜杠开头。其他合法字符还包括大小写英文字母、阿拉伯数字、减号 -、下划线 _ 和小数点 .。例如,/person/123/ 是一个合法的 URL 地址,而 /person/123? 则不合法(存在不合法的字符问号 ?)。另外,英文字母区分大小写,因此 /case/ 和 /CAse/ 是不同的 URL 地址。
  对于 URL 映射规则,同样是以斜杠开始。除了可以是正常的 URL 地址外,还可以包含参数,有以下 3 种:
  字符串 <str>:用于匹配一段字符串,注意字符串里不能包含斜杠。例如,abcde0123。
  整数 <int>:用于匹配一个不带符号的整数,全部由阿拉伯数字组成。例如,01234。
  路径 <path>:用于匹配一段字符串,字符串可以包含斜杠。例如,abcd/0123/。
  以上 3 种参数都必须匹配非空的字符串。简便起见,题目规定规则中 <str> 和 <int> 前面一定是斜杠,后面要么是斜杠,要么是规则的结束(也就是该参数是规则的最后一部分)。而 <path> 的前面一定是斜杠,后面一定是规则的结束。无论是 URL 地址还是规则,都不会出现连续的斜杠。

输入格式

  输入第一行是两个正整数 nm,分别表示 URL 映射的规则条数和待处理的 URL 地址个数,中间用一个空格字符分隔。
  第 2 行至第 n+1 行按匹配的先后顺序描述 URL 映射规则的配置信息。第 i+1 行包含两个字符串 piri,其中 pi 表示 URL 匹配的规则,ri 表示这条 URL 匹配的名字。两个字符串都非空,且不包含空格字符,两者中间用一个空格字符分隔。
  第 n+2 行至第 n+m+1 行描述待处理的 URL 地址。第 n+1+i 行包含一个字符串 qi,表示待处理的 URL 地址,字符串中不包含空格字符。

输出格式

  输入共 m 行,第 i 行表示 qi 的匹配结果。如果匹配成功,设匹配了规则 pj ,则输出对应的 rj。同时,如果规则中有参数,则在同一行内依次输出匹配后的参数。注意整数参数输出时要把前导零去掉。相邻两项之间用一个空格字符分隔。如果匹配失败,则输出 404。

样例输入

5 4
/articles/2003/ special_case_2003
/articles/<int>/ year_archive
/articles/<int>/<int>/ month_archive
/articles/<int>/<int>/<str>/ article_detail
/static/<path> static_serve
/articles/2004/
/articles/1985/09/aloha/
/articles/hello/
/static/js/jquery.js

样例输出

year_archive 2004
article_detail 1985 9 aloha
404
static_serve js/jquery.js

样例说明

  对于第 1 个地址 /articles/2004/,无法匹配第 1 条规则,可以匹配第 2 条规则,参数为 2004。
  对于第 2 个地址 /articles/1985/09/aloha/,只能匹配第 4 条规则,参数依次为 1985、9(已经去掉前导零)和 aloha。
  对于第 3 个地址 /articles/hello/,无法匹配任何一条规则。
  对于第 4 个地址 /static/js/jquery.js,可以匹配最后一条规则,参数为 js/jquery.js。

数据规模和约定

  1 ≤ n ≤ 100,1 ≤ m ≤ 100。
  所有输入行的长度不超过 100 个字符(不包含换行符)。
  保证输入的规则都是合法的。

代码

#url
import re
m,n=map(int,input().split())

rules ={}
rlist ={}
querys =[]

for i in range(m):
    rule,name = input().split()
    rlist[rule] = rule.split("/")
    rules[rule] = name
    
for i in range(n):
    query = input()
    q = query.split("/")
    find=False
    for rule in rules.keys():
        r = rlist[rule]
        if(len(q)>=len(r)):
            args=[]
            match=0
            RightPath=False
            for j in range(len(r)):
                if(q[j]==r[j]):
                    match+=1
                    
                elif(q[j].isdigit() and r[j]=="<int>"):
                    args.append(str(int(q[j])))
                    match+=1
                    
                elif(r[j]=="<str>"):
                    if(q[j]==""):       #加了这个判断就100分了 ?!空字符串对应<str>
                        break
                    args.append(q[j])
                    match+=1
                    
                    
                elif(r[j]=="<path>"): 
                    args.append("/".join(q[len(r)-1:]))
                    RightPath=True
                    match+=1
                    
                else:
                    break
            
            if(match == len(r) and (len(q)==len(r) or RightPath)):
                print(rules[rule]+" "+" ".join(args))
                find=True
                break
        else:
            continue
    if(not find):
        print("404")

 

<think>好的,我需要回答用户关于CSP中矩阵重塑的方法和实现的问题。首先,用户提到的CSP可能是指CCF CSP认证考试中的矩阵重塑题目,而不是约束满足问题。根据用户提供的引用资料,我需要结合这些题解来解释矩阵重塑的实现方法。 首先,矩阵重塑的基本条件是两个矩阵的总元素数相同,即$n \times m = p \times q$。这一点在引用[2]中已经提到。接下来,重塑操作需要保持行主序,也就是将原矩阵按行展开成一维数组后,再按行填充到新矩阵中。例如,原矩阵的行主序元素顺序不变,直接重新排列成新矩阵的形状。这可以通过计算元素在一维数组中的索引来实现,而不需要实际创建中间数组,如引用[3]所述,直接操作一维数组更高效。 然后,用户可能还想了解转置与重塑的区别。根据引用[1]和[4],转置会改变行主序为列主序,而重塑保持行主序。因此,在实现时需要注意两者的不同处理方式。 接下来需要给出具体的实现步骤。例如,重塑可以通过遍历原矩阵的每个元素,计算其在行主序中的位置,然后根据新矩阵的行列数确定对应的行和列。这种方法的时间复杂度是$O(nm)$,空间复杂度可以优化到$O(1)$,如果直接在原数据上操作的话。 代码示例方面,可以用Python展示如何将原矩阵重塑为新矩阵。例如,先展平原矩阵,再按新行列填充。但根据引用[3]的建议,应避免频繁创建新矩阵,所以可以优化为直接计算索引,而无需实际展平。 最后,生成相关问题需要考虑矩阵重塑的条件、实现中的优化方法、转置与重塑的区别,以及实际应用场景。这些问题能帮助用户深入理解该主题。</think>### CSP矩阵重塑方法及实现 在CCF CSP认证题目中,矩阵重塑的核心是**保持元素的行主序存储顺序**,通过改变矩阵维度实现形态转换。以下是具体实现方法: --- #### **一、实现条件** 1. 总元素数一致:原矩阵维度$n \times m$与新矩阵$p \times q$需满足$n \times m = p \times q$[^2]。 2. 操作方式:重塑不改变元素的行主序顺序,仅重新划分行列布局[^1]。 --- #### **二、实现步骤** 1. **展平为一维数组** 将原矩阵按行遍历转换为连续的一维数组。例如,原矩阵$M$的索引$(i,j)$对应一维数组位置$k = i \times m + j$[^3]。 2. **填充新矩阵** 按新矩阵的行列数$p \times q$,将一维数组元素依次填入。新矩阵的索引$(x,y)$对应一维数组位置$k = x \times q + y$。 --- #### **三、Python实现示例** ```python def reshape_matrix(matrix, p, q): n = len(matrix) m = len(matrix[0]) if n > 0 else 0 if n * m != p * q: return None # 无法重塑 # 展平为一维数组 flattened = [element for row in matrix for element in row] # 按新维度填充 new_matrix = [] for i in range(p): new_row = flattened[i*q : (i+1)*q] new_matrix.append(new_row) return new_matrix ``` --- #### **四、性能优化** 1. **直接索引计算**:无需实际展平数组,直接通过公式计算新旧索引的映射关系: $$x = \left\lfloor \frac{k}{q} \right\rfloor, \quad y = k \mod q$$ 其中$k = i \times m + j$(原矩阵位置)。 2. **时间复杂度**:$O(nm)$,空间复杂度可优化至$O(1)$(若允许覆盖原数据)。 --- #### **五、转置与重塑的区别** - **重塑**:仅改变维度,保持行主序不变。例如,原行主序为$[1,2,3,4]$的$2 \times 2$矩阵,重塑为$4 \times 1$后仍为$[[1],[2],[3],[4]]$。 - **转置**:行列互换,行主序变为列主序。例如,转置后的$2 \times 2$矩阵行主序为$[1,3,2,4]$[^4]。 ---
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值