Markdown题目的详细信息(传送门)
这个题目本身难度不是很大,但是但是有一些注意的细节,只需要将string的方法运用熟练,接这道题是没有多大的难度的,首先我给大家提供了一组测试数据,如果这个可以通过,基本上就不会存在扣分的问题。 |
---|
输入样例:
* peare1
# _Heading_
##### Heading
## Sub-heading
Paragrapha are separated
_A_ [link](http://exaup1e.com)
by a blank line.
Text attributes _italic_.
* applea
* orangea
* peare2
* peare3
_A_ [link](http://exaup1e.com)
123
* peare4
输出样例:
<ul>
<li>peare1</li>
</ul>
<h1><em>Heading</em></h1>
<h5>Heading</h5>
<h2>Sub-heading</h2>
<p>Paragrapha are separated
<em>A</em> <a href="http://exaup1e.com">link</a>
by a blank line.</p>
<p>Text attributes <em>italic</em>.</p>
<ul>
<li>applea</li>
<li>orangea</li>
<li>peare2</li>
</ul>
<ul>
<li>peare3</li>
</ul>
<p><em>A</em> <a href="http://exaup1e.com">link</a>
123</p>
<ul>
<li>peare4</li>
</ul>
还有需要注意的一点是对无序列表的处理,我第一次提交的时候只有50分,原因就是没有考虑列表在第一行,最后一行,以及两个列表挨在一起的情况,一下是满分代码: |
---|
#include <bits/stdc++.h>
using namespace std;
void trim(string &s){//此函数是将一个字符串的首尾空格删掉
if(!s.empty()){
s.erase(0,s.find_first_not_of(" "));
s.erase(s.find_last_not_of(" ") + 1);
}
}
int main(){
vector<string> vet;
string line;
int i = 0;int j = 0;//i和j判断p标签是否分段,以及多个无序列表是否相邻
int ul = 1; //判断ul是否完整,0的话还差一个结尾,1的话是完整的
while(getline(cin,line)){
ul = 1;
/*
先处理行内样式,每次都会用到,不分类;
*/
if(line.length() > 0){
while(line.find('_') != string::npos){ //处理斜体(<em></em>)一行可能有多个,所以加一个循环
line.replace(line.find('_'),1,"<em>");
line.replace(line.find('_'),1,"</em>");
}
while(line.find('[') != string::npos){ //处理连接a标签([link])一行可能有多个,所以加一个循环
line.replace(line.find(']'),1,"</a>");
int start = line.find('(');
line.erase(line.begin()+start);
int end = line.find(')');
string ss = line.substr(start,end-start);
line.erase(start,end-start+1);
string s = "<a href=\"" + ss + "\">";
line.replace(line.find('['),1,s);
}
/*
处理区块
*/
if(line[0] == '*' || (vet.size()>1 && vet[vet.size()-1].find("<li>") != string::npos)){//先处理无序列表*
string s = line.substr(1);
trim(s);
if(vet.size()>0 && vet[vet.size()-1].find("<li>") != string::npos){//不是第一个,处理
if(line[0] != '*'){
ul = 1;
vet.push_back("</ul>");
}else{
if(j+1 != i){ //如果两个无序标签挨着,(有空行也算挨着),先这样处理
vet.push_back("</ul>");
vet.push_back("<ul>");
}
ul = 0;
vet.push_back("<li>" + s + "</li>");
}
}else{ //第一个,直接处理
vet.push_back("<ul>");
vet.push_back("<li>" + s + "</li>");
ul = 0;
}
}
if(line[0] == '#'){ //处理标题
int start = line.find(' ');
stringstream s;s << start;string num = s.str();//将数字start转化为字符串num
string str = line.substr(start);
trim(str);
str = "<h" + num + ">" + str + "</h" + num + ">";
vet.push_back(str);
}else if(line[0] != '*'){ //处理文章样式,p标签
if(j+1 == i && vet[vet.size()-1].find("</p>") != string::npos){//文章分行的时候
string str = vet[vet.size()-1];
vet[vet.size()-1] = str.substr(0,str.size()-4);
vet.push_back(line + "</p>");
}else{ //只有一行
vet.push_back("<p>" + line + "</p>");
}
}
j = i;
}
i++;
if(i == 21){//这是为了检测自己写的是否正确,你想输入几行,这就写i == 多少
break;
}
}
for(int k = 0; k < vet.size(); k++){
cout << vet[k] << endl;
}
//如果这是最后一行,无序列表需要加入后面的标签</ul>
if(ul != 1){
cout << "</ul>";
}
return 0;
}
这里是题目O(∩_∩)O,欢迎大家留言,有空的话可以点个赞哦(#^ . ^#)
试题编号:
|
201703-3 |
---|---|
试题名称: | Markdown |
时间限制: | 1.0s |
内存限制: | 256.0MB |
问题描述: | 问题描述Markdown 是一种很流行的轻量级标记语言(lightweight markup language),广泛用于撰写带格式的文档。例如以下这段文本就是用 Markdown 的语法写成的:这些用 Markdown 写成的文本,尽管本身是纯文本格式,然而读者可以很容易地看出它的文档结构。同时,还有很多工具可以自动把 Markdown 文本转换成 HTML 甚至 Word、PDF 等格式,取得更好的排版效果。例如上面这段文本通过转化得到的 HTML 代码如下所示: 本题要求由你来编写一个 Markdown 的转换工具,完成 Markdown 文本到 HTML 代码的转换工作。简化起见,本题定义的 Markdown 语法规则和转换规则描述如下:
输入格式输入由若干行组成,表示一个用本题规定的 Markdown 语法撰写的文档。输出格式输出由若干行组成,表示输入的 Markdown 文档转换成产生的 HTML 代码。样例输入# HelloHello, world! 样例输出<h1>Hello</h1><p>Hello, world!</p> 评测用例规模与约定
每个测试点包含的语法规则如下表所示,其中“√”表示包含,“×”表示不包含。 提示 |