查看: 1241| 回复: 5
跳转到指定楼层
上一主题 下一主题
收起左侧

[字符串] 请教一道MS的OA题目

全局:

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

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

x
给定一个只有小写字母的字符串,规定删除一个字符为一次删除操作,求最少删除多少次可以让每个字母出现的频率不一样

上一篇:Course Schedule II 如何用DFS找出所有path
下一篇:lc82如果我非要用三个指针的话
推荐
qldx 2019-11-7 14:02:10 | 只看该作者
全局:
先统计频率,然后频率逆序,每一个和前面比较,如果比前面大/等于,则处理为小于1的数,要考虑0带来的影响
  1. import collections
  2. def minDeletions(s):
  3.     counts = collections.Counter(s)
  4.     freq = sorted(list(counts.values()),reverse=True)
  5.     res = 0
  6.     for i in range(1,len(freq)):
  7.         if freq[i]>=freq[i-1] and freq[i-1]!=0:
  8.             res +=freq[i]-freq[i-1]+1
  9.             freq[i] = freq[i-1]-1
  10.         elif freq[i-1]==0:
  11.             res+= freq[i]
  12.             freq[i]==0
  13.     return res
复制代码

评分

参与人数 1大米 +3 收起 理由
一剑终情 + 3 欢迎来一亩三分地论坛!

查看全部评分

回复

使用道具 举报

推荐
mint0715 2019-11-7 09:19:18 | 只看该作者
全局:
本帖最后由 mint0715 于 2019-11-7 09:22 编辑

原理大概就是:
aaabbbcccddd -> aaabbccdd -> aaabbcd -> aaabbc

  1. import collections


  2. class Solution:
  3.     def mindelete(self, s):
  4.         result = 0
  5.         counter = collections.Counter(collections.Counter(s).values())
  6.         stack = [[key, val] for key, val in counter.items()]
  7.         # [key, val] = [5, 3] means: There are 3 different characters appear 5 times.
  8.         stack.sort()
  9.         while stack:
  10.             key, val = stack.pop()
  11.             if key + 1 < val:
  12.                 return -1       #Impossible cases like "There are 4 chars appear 2 times".
  13.             result += val - 1
  14.             if stack and key - 1 == stack[-1][0]:
  15.                 stack[-1][1] += val - 1
  16.             elif val - 1 > 0:
  17.                 stack.append([key - 1, val - 1])
  18.         return result


  19. assert(Solution().mindelete('aaabbbcccddd') == 6)
  20. assert(Solution().mindelete('aabbccdd') == -1)
  21. assert(Solution().mindelete('aaaabbbccd') == 0)
  22. assert(Solution().mindelete('aaaab') == 0)
  23. assert(Solution().mindelete('aaaaaaaaaabbbbbbbbbbccccccccccddddddddddeeeeeeeeeeffffffffff') == 15)
复制代码

评分

参与人数 1大米 +3 收起 理由
一剑终情 + 3 很有用的信息!

查看全部评分

回复

使用道具 举报

🔗
Shen.TT 2019-11-7 04:03:08 | 只看该作者
全局:
我感觉是bucket sort类似的问题,先把数组每个字符频率统计出来,然后从最高的频率往下处理。如果有重复频率就删的只剩一个,以此类推
回复

使用道具 举报

全局:
25! ?
回复

使用道具 举报

🔗
Luffy_Tse 2019-11-7 05:50:35 | 只看该作者
全局:
先统计 字母:频率
然后把 频率:字母数 加入到一个treemap
从大到小过一遍频率
如果当前频率的个数m大于1,那么修改就要增加 m-1,同时udpate map, 当前频率-1:m-1
回复

使用道具 举报

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

本版积分规则

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