你需要两个存储。
- 映射
bandname
到其顶部的字典songname
。让我们称之为topBandSong
。
- 映射
(bandname, songname)
到这首歌的播放次数的字典。让我们称之为bandSongPopularity
。
这topSong
很简单(撇开对乐队一无所知的情况):
Map<String, String> topBandSong = new HashMap();
String topSong(String bandname) {
return topBandSong.get(bandname);
}
该play
函数必须更新两个地图。这真的很容易:
Map<String, BigInteger> bandSongPopularity = new HashMap();
void play(String bandname, String songname) {
/* First update bandSongPopularity */
String k = bandname + "\000" + songname;
BigInteger popularity = bandSongPopularity.get(k);
if (popularity == null) {
popularity = BigInteger.valueOf(1);
}
else {
popularity = popularity.add(BigInteger.valueOf(1));
}
bandSongPopularity.put(k, popularity);
/* then update topBandSong */
String top = topSong(bandname);
if (top == null) {
topBandSong.put(bandname, songname);
}
else {
String topK = bandname + "\000" + top;
BigInteger topPopularity = bandSongPopularity.get(topK);
/* topPopularity can not be NULL */
if (popularity.compareTo(topPopularity) > 0) {
topBandSong.put(bandname, songname);
}
}
/* Finally really play this song. But this is left as an exercise ;-) */
}
复杂性是您选择的基础字典之一,即树或散列。
请注意,代码保留字符编号 0。