题目描述:
有一个文件, 包含以一定规则写作的文本, 请统计文件中包含的文本数量
规则如下
-
文本以";“分隔,最后一条可以没有”;",但空文本不能算语句,比如"COMMAND A; ;"只能算一条语句.
注意, 无字符/空白字符/制表符都算作"空"文本
-
文本可以跨行, 比如下面, 是一条文本, 而不是三条
COMMAND A AND COMMAND B; -
文本支持字符串, 字符串为成对的单引号(')或者成对的双引号("), 字符串可能出现用转义字符()处理的单双引号(比如"your input is: “”)和转义字符本身, 比如 COMMAND A “Say “hello””;
-
支持注释, 可以出现在字符串之外的任意位置, 注释以"–"开头, 到换行结束, 比如
COMMAND A; -- this is comment COMMAND -- comment A AND COMMAND B;注意, 字符串内的"–", 不是注释
输入描述:文本文件
输出描述:包含的文本数量
示例
示例1
输入:
COMMAND TABLE IF EXISTS "UNITED STATE";
COMMAND A GREAT (
ID ADSAB,
download_length INTE-GER, -- test
file_name TEXT,
guid TEXT,
mime_type TEXT
notifica-tionid INTEGER,
original_file_name TEXT,
pause_reason_type INTEGER,
resumable_flag INTEGER,
start_time INTEGER,
state INTEGER,
folder TEXT,
path TEXT,
total_length INTE-GER,
url TEXT
);
输出:2
源码
import java.util.ArrayList;
import java.util.List;
public class ReadCommand {
static Input input ;
static {
input = new Input("123\";\"" +
"COMMAND TABLE IF EXISTS \"UNITED STATE\";\n" +
" COMMAND A GREAT (\n" +
" ID ADSAB,\n" +
" download_length INTE-GER, -- test\n" +
" file_name TEXT,\n" +
" guid TEXT,\n" +
" mime_type TEXT\n" +
" notifica-tionid INTEGER,\n" +
" original_file_name TEXT,\n" +
" pause_reason_type INTEGER,\n" +
" resumable_flag INTEGER,\n" +
" start_time INTEGER,\n" +
" state INTEGER,\n" +
"\n" +
" folder TEXT,\n" +
"\n" +
" path TEXT,\n" +
"\n" +
" total_length INTE-GER,\n" +
"\n" +
" url TEXT\n" +
"\n" +
");" +
"ssdfad s ---- sdfasdf");
}
public static void main(String[] args) {
StringBuilder builder = new StringBuilder();
while (input.hasNextLine()) {
String line = input.nextLine().trim();
if (line.length() == 1 && line.charAt(0) == '\n') {
continue;
}
builder.append(line).append("\n");
}
int len = builder.length();
int[] tag = new int[len];
// 引号的开始位置
int start = -1;
for (int i = 0; i < len; i++) {
if ((builder.charAt(i) == '\'' || builder.charAt(i) == '"') && !plainChar(i, builder)) {
if (start == -1) {
start = i;
} else {
while (start <= i) {
tag[start++] = 1;
}
start = -1;
}
}
}
// 找出注释
for (int i = 1; i < len; i++) {
if (builder.charAt(i) == '-' && builder.charAt(i-1) == '-' && !plainChar(i, builder)) {
int p = i - 1;
while (builder.charAt(p) != '\n') {
tag[p++] = 2;
}
i = p;
}
}
// 找出分号
List<Integer> semicolon = new ArrayList<>();
semicolon.add(-1);
for (int i = 0; i < len; i++) {
if (builder.charAt(i) == ';' && tag[i] < 1 && !plainChar(i, builder)) {
semicolon.add(i);
}
}
semicolon.add(len);
int result= 0;
for (int i = 1; i < semicolon.size(); i++) {
int l = semicolon.get(i - 1) + 1;
int r = semicolon.get(i) - 1;
boolean flag = false;
while (l <= r) {
if (builder.charAt(l) != ' ' && builder.charAt(l) != '\n' && tag[l] < 1 && builder.charAt(l) != '\t') {
flag = true;
break;
}
l++;
}
if (flag) {
result++;
}
}
System.out.println(result);
// -- System.out.println(builder.toString());
}
// 判断是否是转义字符串
public static boolean plainChar(int ch, StringBuilder builder) {
int count = 0;
while (ch - 1 >= 0) {
if (builder.charAt(ch - 1) == '\\') {
count++;
ch--;
} else {
break;
}
}
return count % 2 == 1;
}
}

被折叠的 条评论
为什么被折叠?



