Problem Statement | |||||||||||||
In music, each note has a relative duration. For example, a whole note lasts four times longer than a quarter note. Half notes, eighth notes, and sixteenth notes have one half, one eighth, and one sixteenth the duration of whole notes, respectively. A musical composition is characterized by its time signature, which defines the number of beats per measure. Time signatures are written as fractions, where the numerator is the number of beats, and the denominator is the type of note represented by each beat. For example, a time signature of 2/4 indicates that each measure contains two beats, each of which are quarter notes. A time signature of 3/8 indicates that each measure contains three beats, each of which are eighth notes. For the purposes of this problem, we will only consider the following time signatures: 3/8, 2/4, 3/4 and 4/4. It is difficult for an untrained musician to determine the time signature of a composition. It is even more difficult for a computer. You will be given a String duration containing the description of a composition. Each character of duration corresponds to a single note in the composition. 'W' denotes a whole note, 'H' a half note, 'Q' a quarter note, 'E' an eighth note, and 'S' a sixteenth note. Determine the time signature of the composition using the following heuristic algorithm (which is not very good, but quite simple):
Return the time signature as a String ("3/8", "2/4", "3/4", or "4/4"), or return "?/?" (quotes for clarity only) if there are no time signatures left after step 1. | |||||||||||||
Definition | |||||||||||||
| |||||||||||||
Constraints | |||||||||||||
- | duration will have between 1 and 50 characters, inclusive. | ||||||||||||
- | Each character in duration will be 'W', 'H', 'Q', 'E' or 'S'. | ||||||||||||
Examples | |||||||||||||
0) | |||||||||||||
| |||||||||||||
1) | |||||||||||||
| |||||||||||||
2) | |||||||||||||
| |||||||||||||
3) | |||||||||||||
| |||||||||||||
4) | |||||||||||||
|
public class CompositionTimeSignature {
public String getTimeSignature(String d) {
int[] mods = {6, 8, 12, 16};
String[] sigs = {"3/8", "2/4", "3/4", "4/4"};
String t = "SEQHW", ret = "?/?";
int len = 0, min = Integer.MAX_VALUE;
for (int i = 0; i < d.length(); i++)
len += 1 << (t.indexOf(d.charAt(i)));
for (int i = 0; i < mods.length; i++) {
if (len % mods[i] != 0)
continue;
int ruler = 0, cnt = 0;
for (int j = 0; j < d.length(); j++) {
ruler += 1 << t.indexOf(d.charAt(j));
if (ruler > mods[i])
cnt++;
ruler %= mods[i];
}
if (cnt < min) {
min = cnt;
ret = sigs[i];
}
}
return ret;
}
}