华为OD机试 - 文本统计分析(Java 2024 E卷 100分)

在这里插入图片描述

华为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在线答疑。

在这里插入图片描述

  • 11
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

哪 吒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值