转载自https://blog.youkuaiyun.com/kidchildcsdn/article/details/81664006
试题编号: | 201803-3 |
试题名称: | URL映射 |
时间限制: | 1.0s |
内存限制: | 256.0MB |
问题描述: | 问题描述 URL 映射是诸如 Django、Ruby on Rails 等网页框架 (web frameworks) 的一个重要组件。对于从浏览器发来的 HTTP 请求,URL 映射模块会解析请求中的 URL 地址,并将其分派给相应的处理代码。现在,请你来实现一个简单的 URL 映射功能。 输入格式 输入第一行是两个正整数 n 和 m,分别表示 URL 映射的规则条数和待处理的 URL 地址个数,中间用一个空格字符分隔。 输出格式 输入共 m 行,第 i 行表示 qi 的匹配结果。如果匹配成功,设匹配了规则 pj ,则输出对应的 rj。同时,如果规则中有参数,则在同一行内依次输出匹配后的参数。注意整数参数输出时要把前导零去掉。相邻两项之间用一个空格字符分隔。如果匹配失败,则输出 404。 样例输入 5 4 样例输出 year_archive 2004 样例说明 对于第 1 个地址 /articles/2004/,无法匹配第 1 条规则,可以匹配第 2 条规则,参数为 2004。 数据规模和约定 1 ≤ n ≤ 100,1 ≤ m ≤ 100。 |
java:
import java.util.Scanner;
public class Main {
static Scanner sc;
static Url url[];
static String print[];
static int n,m;
public static void main(String[] args) {
sc = new Scanner(System.in);
n = sc.nextInt(); //URL映射的规则条数
m = sc.nextInt(); //待处理的URL地址个数
url = new Url[n];
print = new String[m]; //保存输出的结果
sc.nextLine();
for(int i=0;i<n;i++) {
String temp = sc.nextLine()+" ";
String[] cmd = temp.split(" ");
url[i] = new Url(cmd[0],cmd[1]);
}
for(int i=0;i<m;i++) {
String temp = sc.nextLine();
String[] cmd = temp.split("/");
deal(url,cmd,i); //处理的函数
}
for(int i=0;i<m;i++) {
if(print[i] == null) {
System.out.println("404");
}else
System.out.println(print[i]);
}
}
public static void deal(Url[] url,String[] cmd,int p) {
for (int i = 0; i < n; i++) {
int count = 0; //相等的数量
boolean flag = false;
int check=0;
String[] str = url[i].rule.split("/");
if(str[1].equals(cmd[1]) && cmd.length >= str.length) {
for (int j=2; j < str.length; j++) {
if (str[j].equals(cmd[j])) {
count++;
} else {
if (str[j].contains("int") && cmd[j].matches("[0-9]{1,}")) {
count++;
} else if (str[j].contains("str") && !cmd[j].matches("[0-9]{1,}")) {
count++;
} else if (str[j].contains("path")) {
check = j;
flag = true;
break;
}
}
}
} else {
continue;
}
if(flag == true) { //表示规则中存在<path>
for(int k=check;k<cmd.length;k++) {
if(print[p] == null) {
print[p] = cmd[k]+"/";
}
else
print[p]=print[p]+cmd[k]+"/";
}
print[p] = print[p].substring(0, print[p].length()-1);
print[p] = url[i].name+" "+print[p];
break;
} else {
if (count == cmd.length - 2) { //均符合规则
for (int k = 2; k < cmd.length; k++) {
if (cmd[k].matches("[0-9]{1,}") && cmd[k].charAt(0) == '0') { //判断是否为数字并且数字是否以0开头
cmd[k] = cmd[k].substring(1); //如果数字以0开头 那么取除了0的字串
}
if(print[p] == null) {
print[p] = " " + cmd[k];
}else
print[p] = print[p]+" " + cmd[k];
}
print[p] = url[i].name + print[p];
break;
} else {
continue;
}
}
}
}
}
class Url {
public String rule; // 匹配规则
public String name; //匹配名字
public Url(String rule, String name) {
this.rule = rule;
this.name = name;
}
}