1. 程式人生 > >CCF-201703-3-Markdown-(Java-100分)

CCF-201703-3-Markdown-(Java-100分)

這題圖片很多就不貼圖和複製題目了,直接進入正題
這題在第三題裡面算是中等難度,但是我在練習時也花了很多時間,唉!這道題其實還是挺麻煩,很噁心的。

思路
一行行讀取程式碼,遇到某行是空的,而且上一行是有程式碼的就表示此區塊程式碼結束。我們要做的是在某個區塊結束後輸出某個區塊的轉換程式碼。

在讀到區塊首行的時候要判斷是什麼區塊型別。是標題,列表還是段落?然後在區塊程式碼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; } }