洛谷 Java P5587 打字练习

   这个字符串的题目是真的有坑,会让你卡在50分,废话不多说,直接解题。

1.解题

    这个算是我第一次由c语言小白到Java小白的第一次吧,首先这个题用c语言并不好做,手动控制内存释放太折磨人了,因此我转向了Java。

   首先就是题目文本内容的读入,这就不得不提Java的集合中的ArrayList,非常好用。比如像这样,就创建好了两个字符串的ArrayList。

 ArrayList<String> referenceLines = new ArrayList<>();
 ArrayList<String> inputLines = new ArrayList<>();

  再按照题目的意思,用EOF为分割点,我这里用while循环来读取文本内容,同时,本题的坑点就来了,我们需要把退格符前一个字符删掉,两个文本都需要,一开始我也考虑过例文有退格符,我还把例文和输入的文本比较,看一看哪些退格符不用删,其实题目一开始就说了只有三种符号,因此,文本里的退格符都要处理,这里用processLine方法来处理。

 // 读取范文直到遇到EOF
        while (!(line = scanner.nextLine()).equals("EOF")) {
            referenceLines.add(processLine(line));
        }
        // 读取输入直到遇到EOF
        while (!(line = scanner.nextLine()).equals("EOF")) {
            inputLines.add(processLine(line));
        }

  之后在读入时间即可。

  然后,在主类中把整体思路写一下,那么就是求和计算了,就是统计个数,再四舍五入计算,如下

// 统计正确的字符个数
        int correctChars = 0;
        for (int i = 0; i < Math.min(referenceLines.size(), inputLines.size()); i++) {
            correctChars += compareLines(referenceLines.get(i), inputLines.get(i));
        }

        // 计算KPM
        double kpm = correctChars * 60.0 / time;
        System.out.println(Math.round(kpm));

 这里要注意题目的逐行比较,我们只需要取行数最少的就行,用compareLines方法来计数。

2.两个方法

1.processLine方法

public static String processLine(String line) {
        StringBuilder sb = new StringBuilder();
        for (char c : line.toCharArray()) {
            if (c == '<') {
                if (sb.length() > 0) sb.deleteCharAt(sb.length() - 1);
            } else {
                sb.append(c);
            }
        }
        return sb.toString();
    }

这里创建StringBuilder类来创建一个容器来储存,在‘<’出进行处理就行。

2.compareLines方法

public static int compareLines(String line1, String line2) {
        int correctChars = 0;
        for (int i = 0; i < Math.min(line1.length(), line2.length()); i++) {
            if (line1.charAt(i) == line2.charAt(i)) {
                correctChars++;
            }
        }
        return correctChars;
    }

  3.AC代码

import java.util.ArrayList;
import java.util.Scanner;
public class code5 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        ArrayList<String> referenceLines = new ArrayList<>();
        ArrayList<String> inputLines = new ArrayList<>();
        String line;

        // 读取范文直到遇到EOF
        while (!(line = scanner.nextLine()).equals("EOF")) {
            referenceLines.add(processLine(line));
        }

        // 读取输入直到遇到EOF
        while (!(line = scanner.nextLine()).equals("EOF")) {
            inputLines.add(processLine(line));
        }

        // 读取时间
        int time = scanner.nextInt();

        // 统计正确的字符个数
        int correctChars = 0;
        for (int i = 0; i < Math.min(referenceLines.size(), inputLines.size()); i++) {
            correctChars += compareLines(referenceLines.get(i), inputLines.get(i));
        }

        // 计算KPM
        double kpm = correctChars * 60.0 / time;
        System.out.println(Math.round(kpm));
    }

    // 处理退格和换行,返回处理后的字符串
    public static String processLine(String line) {
        StringBuilder sb = new StringBuilder();
        for (char c : line.toCharArray()) {
            if (c == '<') {
                if (sb.length() > 0) sb.deleteCharAt(sb.length() - 1);
            } else {
                sb.append(c);
            }
        }
        return sb.toString();
    }

    // 比较两行文字,返回相同字符的个数
    public static int compareLines(String line1, String line2) {
        int correctChars = 0;
        for (int i = 0; i < Math.min(line1.length(), line2.length()); i++) {
            if (line1.charAt(i) == line2.charAt(i)) {
                correctChars++;
            }
        }
        return correctChars;
    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

cyemd

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

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

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

打赏作者

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

抵扣说明:

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

余额充值