这个字符串的题目是真的有坑,会让你卡在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;
}
}