概述
这题是魔鬼吗?这么麻烦,只给了我40分(╥╯^╰╥)
问题描述
试题编号: | 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。 |
40分的答案:
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Scanner;
public class Main {
class Rule implements Comparable<Rule>{
String url;
String result;
public Rule(String url, String result) {
//去掉首尾的斜杠以方便处理
url = removeSlash(url);
this.url = url;
this.result = result;
}
public int compareTo(Rule o) {
if(o.url.split("/").length>this.url.split("/").length)
return 1;
return -1;
}
}
class OutPut {
String out;
ArrayList<String> parameters;
public OutPut(String out, ArrayList<String> parameters) {
this.out = out;
this.parameters = parameters;
}
@Override
public String toString(){
for(String parameter:parameters){
if(parameter!=null&&!Main.isValidString(parameter))
return "404";
}
String result = out;
for(String parameter:parameters){
if(parameter!=null){
result=result+" "+parameter;
}
}
return result;
}
}
public static boolean isValidString(String s){
char[] chars = s.toCharArray();
boolean flag = true;
for(char c:chars){
boolean tmp = (c>='0'&&c<='9')||(c>='a'&&c<='z')||(c>='A'&&c<='Z')||c=='-'||c=='_'||c=='.'||c=='/';
if(!tmp){
flag = false;
return flag;
}
}
return true;
}
class BooleanAndValue{
boolean flag;
String value;
public BooleanAndValue(boolean flag, String value) {
this.flag = flag;
this.value = value;
}
}
public OutPut outputStrings(String sample, ArrayList<Rule> rules) {
OutPut outPut = null;
String[] splits = sample.split("/");
for (Rule rule : rules) {
boolean flag2 = true;
ArrayList<String> parameters = new ArrayList<>();
String[] rule_splits = rule.url.split("/");
for(int i=0;i<rule_splits.length;i++){
if(rule_splits[i].equals("<path>")){
parameters.add(formString(splits, i));
outPut = new OutPut(rule.result,parameters);
return outPut;
}
else{
if(i>=splits.length)
break;
BooleanAndValue booleanAndValue = coString(rule_splits[i],splits[i]);
flag2=booleanAndValue.flag;
if(!flag2)
break;
else
parameters.add(booleanAndValue.value);
}
}
if(flag2&&splits.length>=rule_splits.length){
outPut = new OutPut(rule.result,parameters);
return outPut;
}
}
outPut = new OutPut("404",new ArrayList<>());
return outPut;
}
public String formString(String[] strings, int i){
String result = "";
for(int j=i;j<strings.length;j++){
result=result+strings[j]+"/";
}
result.substring(0,result.length()-2);
return result;
}
public String removeZero(String s){
while(s.startsWith("0")){
s=s.substring(1);
}
return s;
}
public BooleanAndValue coString(String rule_split, String sample_split){
BooleanAndValue booleanAndValue = null;
if(rule_split.equals(sample_split))
return new BooleanAndValue(true,null);
else if(rule_split.equals("<int>")){
boolean flag = true;
for(int i=0;i<sample_split.length();i++){
if (!Character.isDigit(sample_split.charAt(i))){
flag=false;
}
}
if(flag){
String s= removeZero(sample_split);
return new BooleanAndValue(true,s);
}
else
return new BooleanAndValue(false,null);
}
else if(rule_split.equals("<str>")){
if(sample_split.contains("/")){
return new BooleanAndValue(false,null);
}
return new BooleanAndValue(true,sample_split);
}
else
return new BooleanAndValue(false,null);
}
public String removeSlash(String s) {
s = s.substring(1);
if (s.endsWith("/")) {
s = s.substring(0, s.length() - 1);
}
return s;
}
public void run() {
BufferedReader bin = new BufferedReader(new InputStreamReader(System.in));
Scanner in = new Scanner(System.in);
ArrayList<Rule> rules = new ArrayList<Rule>();
ArrayList<String> samples = new ArrayList<String>();
int ruleLen = 0;
int sampleLen = 0;
try{
String firstLine = bin.readLine();
String[] ss = firstLine.split(" ");
ruleLen = Integer.valueOf(ss[0]);
sampleLen =Integer.valueOf(ss[1]);
}catch (Exception e){
e.printStackTrace();
}
// 读取数据操作
try {
for (int i = 0; i < ruleLen; i++) {
String state = bin.readLine();
String[] states = state.split(" ");
rules.add(new Rule(states[0], states[1]));
}
for (int i = 0; i < sampleLen; i++) {
String sample = bin.readLine();
samples.add(removeSlash(sample));
}
} catch (Exception e) {
e.printStackTrace();
}
Collections.sort(rules);
ArrayList<OutPut> outPuts = new ArrayList<>();
for(String sample:samples){
OutPut outPut = outputStrings(sample,rules);
outPuts.add(outPut);
}
for(int i=0;i<outPuts.size();i++){
System.out.println(outPuts.get(i));
}
}
public static void main(String[] args) {
Main main = new Main();
main.run();
}
}
最后
以上就是无辜小馒头为你收集整理的CCF URL映射的全部内容,希望文章能够帮你解决CCF URL映射所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复