CCF-201703-3-Markdown-(Java-100分)
阿新 • • 發佈:2018-12-01
這題圖片很多就不貼圖和複製題目了,直接進入正題
這題在第三題裡面算是中等難度,但是我在練習時也花了很多時間,唉!這道題其實還是挺麻煩,很噁心的。
思路
一行行讀取程式碼,遇到某行是空的,而且上一行是有程式碼的就表示此區塊程式碼結束。我們要做的是在某個區塊結束後輸出某個區塊的轉換程式碼。
在讀到區塊首行的時候要判斷是什麼區塊型別。是標題,列表還是段落?然後在區塊程式碼blockCode中加入對應的頭標籤。結束的時候在區塊程式碼blockCode里加對應的尾標籤。
在讀行的時候處理所有的連結和強調,處理完加入到區塊程式碼blockCode中。
import java.util.Scanner;
public class Markdown {
public static void main(String[] args){
Scanner input = new Scanner(System.in);
String blockCode = "";
String preLine = "";
while (input.hasNextLine()) {
String line = input.nextLine();
//給此區間加頭標籤,當且僅當此行是區間首行且是非空行
if (blockCode.length() == 0 && line.length() > 0) {
if (line.charAt(0) == '#') {
int hn = 0;
for (int i = 0; i < line.length(); i++) {
if (line.charAt(i) == '#')
hn++;
else
break;
}
line = line.replaceFirst("#* *", "<h" + hn + ">");
}
else if (line.charAt(0) == '*')
blockCode += "<ul>\n";
else
blockCode += "<p>";
}
//判斷該行是否為列表
if (line.contains("*"))
line = "<li>" + line.replaceFirst("\\* *", "") + "</li>";
//處理每行裡面的行內標籤
line = transToEm(line);
line = transToLink(line);
//識別到區間分割,給此區間加尾標籤,然後輸出
//當此行為空且前面行有內容,說明區間在此行開始分隔
if (preLine.length() > 0 && line.length() == 0) {
blockCode = addLast(blockCode);
System.out.println(blockCode);
blockCode = "";
}
//把非空行加入區間程式碼塊中
if (line.length() > 0)
blockCode += line + "\n";
preLine = line;
}
//最後一行因為沒被識別到,要另外加尾標籤然後輸出
blockCode = addLast(blockCode);
System.out.println(blockCode);
}
static String addLast(String blockCode) {
//去掉程式碼塊最後的換行符
blockCode = blockCode.substring(0, blockCode.length()-1);
if (blockCode.contains("<h")) {
int hn = blockCode.charAt(2) - '0';
blockCode += "</h" + hn + ">";
} else if (blockCode.contains("<ul>"))
blockCode += "\n</ul>";
else if (blockCode.contains("<p>"))
blockCode += "</p>";
return blockCode;
}
static String transToEm(String line) {
while (line.contains("_")){
line = line.replaceFirst("_", "<em>");
line = line.replaceFirst("_", "</em>");
}
return line;
}
static String transToLink(String line) {
while (line.contains("[")) {
String text = "";
String link = "";
int tIndexf = line.indexOf("[");
int tIndexl = line.indexOf("]");
int lIndexf = line.indexOf("(");
int lIndexl = line.indexOf(")");
text = line.substring(tIndexf + 1, tIndexl);
link = line.substring(lIndexf + 1, lIndexl);
line = line.replace(line.substring(tIndexf, lIndexl + 1),
"<a href=\"" + link + "\">" + text + "</a>");
}
return line;
}
}