题。题目背景是一个音乐服务,需要实现一个简单的 Trending Songs 系统。
Music Service - Trending Songs
Let's build a simple class that implements a basic in-memory service that:
- Records song play event for a given song id
- Returns play counts for individual songs
- Computes and returns the top K trending songs
- Returns a SQL query that would compute trending songs from a database
给出的代码框架是:
class TrendingService {
public void recordPlay(String songId) {
// TODO
}
public int getPlayCount(String songId) {
// TODO
return 0;
}
public List<String> getTopKSongs(int k) {
// TODO
return Collections.emptyList();
}
/**
* SQL query for computing trending songs from database
*/
}面试官一开始没有给特别复杂的背景,只是说我们要做一个 music service,用来统计歌曲播放次数,并返回 top K trending songs。这个题看起来很简单,但 Karat 这类题通常不是只看你能不能写出来,而是会看你怎么处理边界情况、数据结构选择,以及后面的 SQL 和扩展问题。
“songId 是否一定合法?会不会是 null 或 empty string?”
“如果两首歌播放次数一样,top K 里顺序怎么定?”
“getTopKSongs(k) 里的 k 如果大于歌曲总数怎么办?”
正常做法是返回所有歌曲即可,不需要报错。
“这个服务是否需要考虑并发?”
如果是单线程 in-memory service,用普通 HashMap 就够了;如果考虑多线程,就要考虑 ConcurrentHashMap、AtomicInteger 或同步锁。
SQL Follow-up
面试官后面要求写一个 SQL query,用数据库里的播放记录计算 trending songs。
假设数据库表叫:
song_plays字段包括:
song_id
played_at如果只是统计历史总播放次数,SQL 可以写成:
SELECT song_id, COUNT(*) AS play_count
FROM song_plays
GROUP BY song_id
ORDER BY play_count DESC
LIMIT k;如果题目里的 “trending” 指最近一段时间,比如最近 24 小时的热门歌曲,那么可以加时间条件:
SELECT song_id, COUNT(*) AS play_count
FROM song_plays
WHERE played_at >= NOW() - INTERVAL '24 hours'
GROUP BY song_id
ORDER BY play_count DESC
LIMIT k;如果是 MySQL,时间写法可以是:
SELECT song_id, COUNT(*) AS play_count
FROM song_plays
WHERE played_at >= NOW() - INTERVAL 1 DAY
GROUP BY song_id
ORDER BY play_count DESC
LIMIT k;这里需要注意,不同数据库的时间语法不完全一样,面试中可以先说明自己假设使用 PostgreSQL 或 MySQL。
我们也有代面试,面试辅助,OA代写等服务助您早日上岸~

