微软:2022-8-19-笔试
微软:2022-8-19-笔试
讨论动态:https://www.nowcoder.com/feed/main/detail/c5f5334140504629b1f3225cad4aa2fd
第一题
直接求解+二分优化,复杂度 ,但是无法证明直接求解的是最优解*。
Code
import bisect import math from collections import Counter, defaultdict def solution(X, Y, W): cnt = Counter(X) N = len(cnt.keys()) mi, mx = int(2e9), 0 for i in cnt.keys(): mi = min(mi, i) mx = max(mx, i) if mx - mi <= W: return 1 x_pos = list(sorted(cnt.keys())) i = 0 ans = 0 while i < N: x = x_pos[i] y = x + W + 0.5 j = bisect.bisect(x_pos, y) i = j ans += 1 return ans
第二题
比较通用的解法是:贪心+堆优化。
由于问题的特性,可以只对10个数进行统计和遍历就行,因此可以实现一种更为简洁的写法。
Code
from collections import Counter import heapq class Num: def __init__(self, val, cnt=1): self.val = val self.cnt = cnt def __lt__(self, other): if self.cnt > 1 and other.cnt > 1: return self.val > other.val elif self.cnt > 1: return True elif other.cnt > 1: return False else: return self.val > other.val def __repr__(self): return 'Num(%d, %d)' % (self.val, self.cnt) def solution(S): ans = 0 counter = Counter([int(i) for i in S]) nums = [Num(val, cnt) for val, cnt in counter.items()] heapq.heapify(nums) left, right = '', '' leading_zero = None while len(nums): n = heapq.heappop(nums) cnt = n.cnt val = n.val is_leading_zero = (len(left) == 0 and val == 0) # leading zero if is_leading_zero: if len(nums) == 0: cnt = 1 else: leading_zero = n continue if cnt == 1: left += str(val) break half = cnt // 2 left += str(val) * half right = str(val) * half + right if cnt % 2 == 1: heapq.heappush(nums, Num(val, 1)) if leading_zero: heapq.heappush(nums, leading_zero) ans = left + right return ans
第三题
直接 DFS 即可。
每次 DFS 返回一个 cost 和人数,当前点的 cost 、人数分别为由深层DFS返回的 cost 之和、人数之和,在当前非0的点返回前再对 cost 加上 ceil(当前人数/5)。
Code
import math from collections import Counter, defaultdict vis = defaultdict(bool) g = defaultdict(list) def dfs(u): vis[u] = True cost = 0 cnt = 1 for v in g[u]: if not vis[v]: c, n = dfs(v) cost += c cnt += n if u != 0: cost += int(math.ceil(cnt / 5)) return cost, cnt def solution(A, B): N = len(A) for i in range(N): a = A[i] b = B[i] g[a].append(b) g[b].append(a) cost, cnt = dfs(0) return cost#微软##算法##笔试##23届秋招笔面经#