用java写出“古董键盘”的题解,并添加详细注释
时间: 2024-06-06 14:07:44 浏览: 112
/**
* 古董键盘
* 题目描述:https://www.luogu.org/problemnew/show/UVA12195
*/
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (true) {
String line = sc.nextLine(); // 读入一行
if (line.equals("*")) { // 如果输入的是 "*",则结束循环
break;
}
String[] notes = line.split("/"); // 将每个音符分割开来
int count = 0; // 记录错误的数量
for (int i = 1; i < notes.length; i++) { // 从第二个音符开始遍历
int duration = getDuration(notes[i]); // 获取当前音符的时长
int sum = 0; // 记录当前音符的总时长
for (int j = 0; j < notes[i].length(); j++) { // 遍历当前音符的每个字符
if (notes[i].charAt(j) == 'W') { // 如果是 'W',则加上 64 的时长
sum += 64;
} else if (notes[i].charAt(j) == 'H') { // 如果是 'H',则加上 32 的时长
sum += 32;
} else if (notes[i].charAt(j) == 'Q') { // 如果是 'Q',则加上 16 的时长
sum += 16;
} else if (notes[i].charAt(j) == 'E') { // 如果是 'E',则加上 8 的时长
sum += 8;
} else if (notes[i].charAt(j) == 'S') { // 如果是 'S',则加上 4 的时长
sum += 4;
} else if (notes[i].charAt(j) == 'T') { // 如果是 'T',则加上 2 的时长
sum += 2;
} else if (notes[i].charAt(j) == 'X') { // 如果是 'X',则加上 1 的时长
sum += 1;
}
}
if (sum != duration) { // 如果当前音符的总时长不等于指定的时长,则错误数量加 1
count++;
}
}
System.out.println(count); // 输出错误数量
}
sc.close();
}
/**
* 获取音符的指定时长
* @param note 音符字符串
* @return 音符的指定时长
*/
public static int getDuration(String note) {
if (note.equals("W")) { // 如果是 'W',则返回 64 的时长
return 64;
} else if (note.equals("H")) { // 如果是 'H',则返回 32 的时长
return 32;
} else if (note.equals("Q")) { // 如果是 'Q',则返回 16 的时长
return 16;
} else if (note.equals("E")) { // 如果是 'E',则返回 8 的时长
return 8;
} else if (note.equals("S")) { // 如果是 'S',则返回 4 的时长
return 4;
} else if (note.equals("T")) { // 如果是 'T',则返回 2 的时长
return 2;
} else if (note.equals("X")) { // 如果是 'X',则返回 1 的时长
return 1;
}
return 0; // 如果不是以上任何一种情况,则返回 0 的时长
}
}