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

[树/链表/图] Google电面题,List中的duplicate最小距离

头像被屏蔽
提示: 作者被禁止或删除 内容自动屏蔽

上一篇:平衡数
下一篇:谁能给个Serialization/Deserialization of a Binary Tree Java版完整code?
推荐
a5554794 2015-3-12 08:05:41 | 只看该作者
全局:
尼玛,这题确实不适合电面
我的做法
1.先iterate list, 用hashmap 记下每个字母出现的频率
2.以频率 sort hashmap, 最高频率的在前面, 低频率的在后面
3.把一个list 分成多个buckets, 每个buckets的容量是 minimal distance, 最后一个bucket容量可能小于 minimal distance
4.按频率顺序, 把字母均匀的分配到每个bucket里, 如果某个字母出现的频率大于bucket的数量, return err
5.把buckets合起来,组成一个大的list,就是答案

python code 在此

def minDistanceList(A, d):
        length = len(A)
        freq_map = dict()
        for a in A:
                if a in freq_map:
                        freq_map[a] += 1
                else:
                        freq_map[a] = 1
        freq_list = []
        for a in freq_map:
                freq_list.append((freq_map[a], a))
        freq_list.sort(key = lambda x: x[0], reverse = True)
        buckets_cnt = length/d + (length%d>0)
        buckets = [[] for i in range(buckets_cnt)]
        bucket_idx = 0
        for s in freq_list:
                n = s[0]
                a = s[1]
                if n > buckets_cnt:
                        return None
                for i in range(n):
                        buckets[bucket_idx].append(a)
                        bucket_idx += 1
                        if bucket_idx==buckets_cnt:
                                bucket_idx = 0
        res = []
        for bucket in buckets:
                res += bucket
        return res
   
print minDistanceList(['A','A','A','A','B','B','C'], 2)
print minDistanceList(['A','B','B'], 2)
print minDistanceList(['A','B','B'], 1)
print minDistanceList(['A','B','B'], 3)

########################
results:

['A', 'B', 'A', 'B', 'A', 'C', 'A']
['B', 'A', 'B']
['B', 'B', 'A']
None
回复

使用道具 举报

推荐
mingmingya 2015-3-16 11:37:05 | 只看该作者
全局:
a5554794 发表于 2015-3-12 08:05
尼玛,这题确实不适合电面
我的做法
1.先iterate list, 用hashmap 记下每个字母出现的频率

觉得这个做法挺好~
回复

使用道具 举报

🔗
marstorm08 2014-3-13 08:21:18 | 只看该作者
全局:
感觉是一个DFS的题目 说一个大概的想法哈 用一个hashmap来存每一个string最近被存放的位置 其实也就是当前搜索的深度  然后每次从剩下的可选String里面选一个合法的加到结果队列里面去 如果可选集合空了 说明找到了一个合法解 就返回

回复

使用道具 举报

🔗
RomanC 2014-3-13 10:38:26 | 只看该作者
全局:
我的想法是这样的:
1。先统计list中不同元素的个数,假设为u,如果u < minimal distance,则无解
2. 否则按照出现的次数将list中的元素从大到小进行排序,假设排完后为x1,x2,。。。。xn,即x1出现的次数大于x2,x2出现的次数大于x3等。
3. 然后可以构造一组解,x1,x2,......xn,x1,x2....xn,x1,x2...这样排列下去。应该就是符合条件的
回复

使用道具 举报

🔗
readman 2014-3-13 10:49:04 | 只看该作者
全局:
我能想的是动态规划。 放到一个二维数组. 横竖每个都是字符。
然后从左上开始,遇到一样的跳过去,并记录。
不一样的swap。

不过目测需要n2
回复

使用道具 举报

🔗
readman 2014-3-13 10:50:36 | 只看该作者
全局:
而且这题能电面??
估计是有很简单的解决方法吧?
回复

使用道具 举报

🔗
北美农民 2014-3-13 11:02:39 | 只看该作者
全局:
RomanC 发表于 2014-3-12 21:38
我的想法是这样的:
1。先统计list中不同元素的个数,假设为u,如果u < minimal distance,则无解
2. 否则 ...

感觉贪心能work, 但感觉不知道怎么证明正确性。
回复

使用道具 举报

🔗
RomanC 2014-3-13 11:17:04 | 只看该作者
全局:
北美农民 发表于 2014-3-13 11:02
感觉贪心能work, 但感觉不知道怎么证明正确性。

我又想了一下,发现我的解法好像是错的。。。
回复

使用道具 举报

🔗
北美农民 2014-3-13 11:27:21 | 只看该作者
全局:
RomanC 发表于 2014-3-12 22:17
我又想了一下,发现我的解法好像是错的。。。

我觉得能work, 你给个反例?
回复

使用道具 举报

🔗
RomanC 2014-3-13 11:51:57 | 只看该作者
全局:
北美农民 发表于 2014-3-13 11:27
我觉得能work, 你给个反例?

比如[A,A,A,A,B,B,C],最小距离为2,合法的应该是[A,B,A,B,A,C,A],感觉构造的方法没有我说的那么简单。。。
回复

使用道具 举报

🔗
csgtc 2014-3-13 12:02:21 | 只看该作者
全局:
loop一遍数duplicates, 比如C重复3次,B重复2次,A重复1次, 那么要让所有duplicates的distance尽可能大,必然数组第一个数是C(重复次数最多的),第二个是B,第三个是C, 最后数组一定是C B A C B (因为要确保所有duplicates的distance都尽可能大) 所以如果input > 2 那就是无解。 同样,如果C重复10次,B2次,A一次, 那么数组要确保所有duplicates距离最大,一定要有这种形式:C B A C B CCCCC.... 所以这个case的input>1就无解了。

此算法还没用数学analysis验证,但是直觉上貌似是对的。。如果有错请勿喷。。。 随便猜的
回复

使用道具 举报

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

本版积分规则

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