小米笔试编程题AC分享

两道题侥幸AC了

1. 集合合并

  • 问题:给定若干集合,将其中交集不为空的集合合并,输出合并后集合个数以及最大集合中元素个数

  • 思路:并查集

  • 代码:

import collections
class Uf(object):
    def __init__(self, n):
        self.id = [i for i in range(n)]
        self.count = n
    def find(self, p):
        while p != self.id[p]:
            p = self.id[p]
        return p
    def union(self,p,q):
        p_id = self.find(p)
        q_id = self.find(q)
        if p_id != q_id:
            for i in range(len(self.id)):
                if self.id[i] == q_id:
                    self.id[i] = p_id
            self.count -= 1
    def connectd(self,p,q):
        return self.find(p) == self.find(q)
    def count():
        return self.count

n = input()
a = []

for _ in xrange(n):
    tmp = set(map(int, raw_input().split()))
    a.append(tmp)

d = collections.defaultdict(list)
for i in xrange(n):
    for val in a[i]:
        d[val].append(i)

uf = Uf(n)
for key,items in d.items():
    father = items[0]
    for it in items:
        uf.union(father,it)

count = uf.count
res = collections.defaultdict(set)

for i in xrange(n):
    p = uf.find(i)
    res[p] |= a[i]

max_res = 0
for k in res:
    max_res = max(max_res, len(res[k]))

print count
print max_res

2. 如何添加运算符

  • 问题:给定1~n,在其中插入加减或空格,空格代表连接两个相邻数字,求表达式和为m的个数;

  • 分析:问题规模不大n<=7,m<=100,直接dfs暴力求解,这里用到了eval(),也可以自己实现转化为后缀表达式求值的函数;

  • 代码:

n,m = map(int, raw_input().split())

res = [0]

def dfs(i,s):
    if i == n:
        if m == eval(s):
            res[0] += 1
    else:
        dfs(i+1,s+'+'+str(i+1))
        dfs(i+1,s+'-'+str(i+1))
        dfs(i+1,s+str(i+1))

dfs(1,'1')
print res[0]
#小米#
全部评论
小米什么时候面试
点赞 回复 分享
发布于 2018-09-27 15:57
请问第一题是开辟了一个大小为n的并查集吗,n不是集合的个数吗,和最大值貌似无关?
点赞 回复 分享
发布于 2018-09-27 15:45
**,第二题一样思路,暴力求解,java代码长了一倍ಥ_ಥ
点赞 回复 分享
发布于 2018-09-27 15:41
还是py好啊,java第二题搞不来
点赞 回复 分享
发布于 2018-09-27 15:38

相关推荐

不愿透露姓名的神秘牛友
04-18 00:14
某工业 嵌入式软件工程师 9K×13薪 本科其他
点赞 评论 收藏
分享
评论
点赞
20
分享

创作者周榜

更多
牛客网
牛客企业服务