回复: 7
跳转到指定楼层
上一主题 下一主题
收起左侧

Google Phone Screen

全局:

2021(7-9月) 码农类General 硕士 全职@google - Other - 技术电面  | 😃 Positive 😐 Average | Other | 在职跳槽

注册一亩三分地论坛,查看更多干货!

您需要 登录 才可以下载或查看附件。没有帐号?注册账号

x
先上题求大米:
Design a playlist that intiallly has a list of songs and a cool down value k. The playlist should randomly return a song to play.
Implement the
您好!
本帖隐藏的内容需要积分高于 188 才可浏览
您当前积分为 0。
使用VIP即刻解锁阅读权限或查看其他获取积分的方式
游客,您好!
本帖隐藏的内容需要积分高于 188 才可浏览
您当前积分为 0。
VIP即刻解锁阅读权限查看其他获取积分的方式
Unlock interview details and practice with AI
Curated Interview Questions from Top Companies
16 +8:00):
补充1:原来楼主想复杂了,不需要linked list也不需要ordered hashmap,只需要交换这次选中的歌曲和即将被解放的歌曲就行。

补充2:今早面的

评分

参与人数 2大米 +7 收起 理由
匿名用户-KN5LH + 5
萌萌的大脑洞 + 2 啥时候面的

查看全部评分


上一篇:罗宾汉 hr面挂经
下一篇:Amazon NG timeline dp
推荐
afglp0000 2021-9-16 06:55:29 | 只看该作者
全局:
可不可以用 一个arr存 等待播放的歌曲 song= [1,3,4,5,6,7,8]
然后另一个 queue 存已经播放的  queue = [0,2,9,10]
当 len(queue) < k 时,随机从song里选出元素,打印,然后放到 queue队尾
如果 len(queue) ==k 时, 把队收的元素popleft出来放回 song。 这样就能保证每次选出的歌曲都是随机,并且满足冷却时间要求
回复

使用道具 举报

全局:
本帖最后由 南宫狗剩 于 2021-9-24 11:28 编辑

我的想法是two pointer, 原本的array首尾相连,每次播放都在left到right之间随机选一个,然后把它和left交换,left++,当外面的数量大于k的时候right++,然后循环就行了。
  1. def __init__( songs, k):
  2.         self.songs = songs
  3.         self.left = self.right = 0
  4.         self.cap = len(songs) - k

  5. def GetSong():
  6.         index = ( self.left + ramdom.randInt( ( self.right - self.left + len( songs)) % len( songs))) % len( songs)
  7.         songs[self.left], songs[index] = songs[index], songs[self.left]
  8.         self.left = ( self.left + 1) % len( songs)
  9.         if ( self.right - self.left + len( songs)) % len( songs) < self.cap:
  10.                 self.right = ( self.right + 1) % len( songs)
复制代码
更新:刚刚反应过来,应该把right更新放在left更新前面,否则在cap = 1的时候会出错
回复

使用道具 举报

推荐
anyonedy 2021-9-15 03:29:57 | 只看该作者
全局:
本帖最后由 anyonedy 于 2021-9-14 12:32 编辑

playlist那个题我的思路是
playlist: [1,2,3,4,5,6] + [0,1, k-1]
            可用区          最近播放区
每次搜索时只在“可用区”搜索
1. 后面类似循环链表,维护一个指针指向k个中最早进入的歌曲,下次play的时候,k个中最早进入的歌曲被交换出“最近播放区”,refill到“可用区”。
2. 注意一开始“最近播放区”是空的,所以需要区别处理

  1. def PlayList(songs: list[int], k: int):
  2.     self.songs = songs
  3.     self.k = k
  4.     # 最近k首播放过的不播,播一首增加1,直到k
  5.     self.exlude_songs_count = 0
  6.     # 一开始play的歌曲交换到最后一个
  7.     self.refill_pointer = len(songs) - 1

  8. def GetSong():
  9.      n = len(self.songs)
  10.      k = self.k
  11.      # 在可选区随机选择一首歌
  12.      index = random.randint(0, n - 1 - self.played_count)
  13.      ret = self.songs[index]
  14.      # 与refill_pointer交换
  15.      self.songs[index], self.songs[self.refill_pointer] = self.songs[self.refill_pointer], self.songs[index]
  16.      # 最多排除k首歌
  17.      if self.exlude_songs_count < k:
  18.          self.exlude_songs_count += 1
  19.      self.refill_pointer -= 1
  20.      # 如果refill_pointer 超出最后k个,跳回整个list尾部(n - 1)
  21.      if self.refill_pointer == n - 1 - k:
  22.          self.refill_pointer = n - k
  23.      return ret
复制代码
例如:
songs = [1,2,3,4 || ], k = 2, exlude_songs_count = 0, refill_pointer = 3
                      ^ <- refill_pointer
"||" 分隔可用区和最近播放区
那么exlude_songs_count = 0, refill_pointer = 3
1. 播放songs[0:3]任意一首,假设songs[0] = 1
songs = [4,2,3,|| 1], k = 2, exlude_songs_count = 1, refill_pointer = 2
                   ^
2. 播放songs[0:2]任意一首,假设songs[0] = 4
songs = [3,2, || 4,1], k = 2, exlude_songs_count = 2, refill_pointer = 3 {开始等于2 - 1 = 1 == (n - 1 - k), 所以跳到列表尾}
                          ^
3. 再播放一首后,1被交换出“最近播放区”,refill到可用区,最近播放的那一首放入“最近播放区”

补充内容 (2021-09-15 10:36 +8:00):
     if self.refill_pointer == n - 1 - k:
         self.refill_pointer = n - k # 这里应该是 n - 1

评分

参与人数 3大米 +4 收起 理由
pantao123 + 1 赞一个
jetfish1900 + 2 给你点个赞!
shenji + 1 给你点个赞!

查看全部评分

回复

使用道具 举报

🔗
 楼主| shenji 2021-9-15 03:38:16 | 只看该作者
全局:
anyonedy 发表于 2021-9-14 12:29
playlist那个题我的思路是
playlist: [1,2,3,4,5,6] + [0,1, k-1]
            可用区          最近播放 ...

我是用的count来track number of calls to GetSong,end = songs.Length - 1 - Min(count, k)。然后从0到end里面随机选取一首歌。和你的思路差不多。不过原来简单的swap就可以了,我硬是想到了double linked list😂。完了,简单问题复杂化了,开始担心面试结果了。
回复

使用道具 举报

🔗
irwinplimpton 2021-9-15 10:23:28 | 只看该作者
全局:
anyonedy 发表于 2021-9-14 12:29
playlist那个题我的思路是
playlist: [1,2,3,4,5,6] + [0,1, k-1]
            可用区          最近播放 ...

最后一行是不是错了,应该跳回到最后一个索引。
         self.refill_pointer = n - 1
回复

使用道具 举报

🔗
anyonedy 2021-9-15 10:34:43 | 只看该作者
全局:
shenji 发表于 2021-9-14 12:38
我是用的count来track number of calls to GetSong,end = songs.Length - 1 - Min(count, k)。然后从0到 ...

面试官不是说接受吗?可能想听一听新的思路?
希望楼主好运。
回复

使用道具 举报

🔗
anyonedy 2021-9-15 10:35:17 | 只看该作者
全局:
irwinplimpton 发表于 2021-9-14 19:23
最后一行是不是错了,应该跳回到最后一个索引。
         self.refill_p ...

是的。。写错了。。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表