华为OD机试 2024E卷题库疯狂收录中,刷题点这里
专栏导读
本专栏收录于《华为OD机试(JAVA)真题(E卷+D卷+A卷+B卷+C卷)》。
刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新,全天CSDN在线答疑。
一、题目描述
有一个文件,包含以一定规则写作的文本,请统计文件中包含的文本数量。
规则如下:
1、文本以";“分隔,最后一条可以没有”;",但空文本不能算语句,比如"COMMAND A;“只能算一条语句。注意,无字符/空白字符Q/制表符等操作"空文本”;
2、文本可以跨行,比如下面,是一条文本,而不是三条;
COMMAND A
AND
COMMAND B;
文本支持字符串,字符串为成对的单引号(‘)或者成对的双引号("),字符串中可能出现用转义字符()处理的单双引号(‘your input is’”)和转义字符串本身,比如
COMMAND A "Say \"hello\"";
支持注释,可以出现在字符串之外的任意位置注释以"—"开头,到换行结束,比如:
COMMAND A; —this is comment
COMMAND —comment
A AND COMMAND B;
注意 字符串Q 内的“—”,不是注释。
二、输入描述
文本文件
三、输出描述
包含的文本数量
四、测试用例
测试用例1:
1、输入
COMMAND A;
COMMAND B;
COMMAND C; — This is a comment
COMMAND D; — Another comment
2、输出
4
3、说明
本例中的文件内容有4个命令,每个命令都以分号结尾。
尽管第三行和第四行后面有注释,注释部分不会影响命令的统计。
因此,总共4条有效命令。
测试用例2:
1、输入
COMMAND A;
COMMAND B
AND COMMAND C;
COMMAND “D"Text”";
— Entire line is a comment
COMMAND E; — Comment at the end
2、输出
4
3、说明
第一行 COMMAND A; 是一条有效命令。
第二行和第三行合并构成一条跨行命令 COMMAND B AND COMMAND C;。
第四行 COMMAND “D"Text”"; 是一条有效命令,其中 " 表示转义字符,表示字符串中的双引号。
第五行是一个注释,应该被忽略。
第六行 COMMAND E; 是一条有效命令,尽管有注释。
最终,共有4条有效命令。
五、解题思路
程序会检查文件内容中的注释,并将这些注释移除。注释是以 “—” 开头,直到该行结束。需要注意的是,程序会确保只移除字符串之外的注释,即在字符串内的 “—” 不会被视为注释。这一步是为了避免注释内容干扰命令的统计。
程序会根据分号(;)将内容分割成多个部分,每个部分代表一个潜在的命令。
对于每个分割出的部分,程序会去除首尾空白符,并检查内容是否为空。只有非空的部分才会被计数为有效命令。这一步是为了确保空白命令或无效的命令不会被错误地计入。
程序会输出统计得到的有效命令数量。这个数量即为文件中符合规则的命令的总数。
六、Java算法源码
public class OdTest01 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
StringBuilder builder = new StringBuilder();
while (sc.hasNextLine()) {
String line = sc.nextLine();
// 本地测试时,以输入空行作为结束条件,实际考试时无需此逻辑
if (line.length() == 0) {
break;
}
builder.append(line).append("\n");
}
String content = builder.toString();
content = removeComments(content);
int count = countCommands(content);
System.out.println(count);
}
// 读取文件内容并将其合并为一个字符串
public static String readFile(String filePath) throws IOException {
StringBuilder content = new StringBuilder();
try (BufferedReader reader = new BufferedReader(new FileReader(filePath))) {
String line;
while ((line = reader.readLine()) != null) {
content.append(line).append("\n");
}
}
return content.toString();
}
// 去除注释内容(字符串内的注释符号不会被处理)
public static String removeComments(String content) {
StringBuilder result = new StringBuilder();
boolean inSingleQuote = false;
boolean inDoubleQuote = false;
int length = content.length();
for (int i = 0; i < length; i++) {
char currentChar = content.charAt(i);
// 检查是否进入/退出单引号字符串
if (currentChar == '\'' && !inDoubleQuote) {
inSingleQuote = !inSingleQuote;
}
// 检查是否进入/退出双引号字符串
else if (currentChar == '"' && !inSingleQuote) {
inDoubleQuote = !inDoubleQuote;
}
// 如果当前不在字符串内,并且检测到注释符号
if (!inSingleQuote && !inDoubleQuote && currentChar == '—') {
// 跳过到换行符
while (i < length && content.charAt(i) != '\n') {
i++;
}
} else {
result.append(currentChar);
}
}
return result.toString();
}
// 统计有效命令的数量
public static int countCommands(String content) {
String[] parts = content.split(";");
int count = 0;
for (String part : parts) {
// 去掉首尾空白后,判断内容是否为空
if (!part.trim().isEmpty()) {
count++;
}
}
return count;
}
}
七、效果展示
1、输入
COMMAND A; —this is comment
COMMAND —comment
A AND COMMAND B;
COMMAND C “Say “hello””;
‘This is a test’ AND “COMMAND D”;
— A comment line
COMMAND E ‘It’s fine’;
2、输出
1
3、说明
注释移除:如 —this is comment 和 —comment 会被移除。
命令分割:程序根据 ; 分割后,得到多个命令。
空命令过滤:确保分割出的每个命令部分不是空的或仅由空白字符组成。
🏆下一篇:华为OD机试 - 简易内存池 - 逻辑分析(Java 2024 E卷 200分)
🏆本文收录于,华为OD机试(JAVA)真题(E卷+D卷+A卷+B卷+C卷)
刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新,全天CSDN在线答疑。