微软笔试 8.26
第一题 求最长每个字符出现次数都是偶数的子串
我的方法很笨比,分治法递归(但是我为了不遗漏所有情况,对于count是1的直接split,对于count%2!=0且>1的从第一个和最后一个该字符处split然后递归,这样就有点傻了),实在是笨比方法,实现的也不优雅放眼望去一大坨儿,就不贴出来献丑了,不知道有没有大佬赐教一下
第二题 最大的组内两两距离相同的组
求余,返回同余数最大的组的长度
def solution(A, M): n = len(A) count = [0] * M for i in range(n): count[A[i] % M] += 1 return max(count)
第三题 数组A和B对应元素合并成C,但尽量使C中没出现的最小正整数越小越好
思路:判断A和B中相同的元素,放到set里。然后遍历出来最小的不在set里的。
正确性检验:
假设set为{1,2}(如[1,2,3,4,3],[1,2,1,3,4]=>[1,2,1,4,4]),那么3一定是C中没出现的最小正整数。
因为,遍历到3时,考虑3和其他数同时出现在A[k]和B[k]:
>比3小的,1和2,他们已经是必选的。3和{1,2}同时出现在A[k]和B[k]时,肯定继续选1或者2就行;
>和3相等的,不可能,因为代表A[k]==B[k]的set里面没有3;
>比3大的,3和比任何比3大的数出现在A[k]和B[k]时都可以选那个更大的。
所以遍历到第一个不存在set中的正整数就是题目所求的值。
def solution(A, B): n = len(A) equal_set = set() for i in range(n): if A[i] == B[i]: equal_set.add(A[i]) for i in range(1, n + 2): if i not in equal_set: return i
