Karat 面经:Music Service – Trending Songs – 代面试 – 一亩三分地 – OA代写 – 面试辅助

题。题目背景是一个音乐服务,需要实现一个简单的 Trending Songs 系统。

Music Service - Trending Songs

Let's build a simple class that implements a basic in-memory service that:

  1. Records song play event for a given song id
  2. Returns play counts for individual songs
  3. Computes and returns the top K trending songs
  4. 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 就够了;如果考虑多线程,就要考虑 ConcurrentHashMapAtomicInteger 或同步锁。

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代写等服务助您早日上岸~

Leave a Reply

Your email address will not be published. Required fields are marked *