小米笔试编程题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]#小米#