yp onsite 31-40

P31 链接 问题是 edit distance的变形题。就是给 两个string (e.g. 'query', 'quray'),然后有三个打分 (类似与 edit distance 的 insert, replace, delete),但每个分数不同,然后叫你算出最小值。反正DP类问题,不难。

class Solution(object):
    def isOneEditDistance(self, s, t):
        """
        :type s: str
        :type t: str
        :rtype: bool
        """

        if len(s)==len(t):
            dif = 0
            for i in range(len(s)):
                if s[i]!=t[i]:
                    dif += 1
            return dif == 1
        elif abs(len(s)-len(t))==1:
            if len(s)>len(t):
                s, t = t, s
            i, j = 0, 0
            while i<len(s) and j<len(t):
                if s[i]==t[j]:
                    i += 1
                    j += 1
                else:
                    j+=1
            return i==len(s) and j==len(t)
        else:
            return False

so = Solution()
ans = so.isOneEditDistance('abc','aac')
print(ans)

我觉得这个也挺难的呀

class Solution(object):
    def minDistance(self, word1, word2):
        """
        :type word1: str
        :type word2: str
        :rtype: int
        """

        dp = [[0]*(len(word2)+1) for _ in range(len(word1)+1)]

        for i in range(len(word1)):
            dp[i+1][0] = i+1
        for j in range(len(word2)):
            dp[0][j+1] = j+1

        for i in range(len(word1)):
            for j in range(len(word2)):
                if word1[i] == word2[j]:
                    dp[i+1][j+1] = dp[i][j]
                else:
                    delete = dp[i][j+1] + 1
                    add = dp[i+1][j] + 1
                    replace = dp[i][j] + 1
                    dp[i+1][j+1] = min([delete, add, replace])

        return dp[-1][-1]

P32 给你1,2,3,4,5个business id, 这里面的business可能是duplicates, 如果是,把它们merge,然后每次只返回最小的那个id. e.g. 1,3,5都是重复的,如果输入3,5 都会返回1。然后他给你三个function 分别是, mark_business(id1,id2), represent(id), compare(id1,id2)。不是的,可以用union find的方法,或者更好的话DFS with strong connectivity,这也是我后来发现的。

class Solution(object):
    def reduce(self, ids, n):
        """
        :type word1: str
        :type word2: str
        :rtype: int
        """
        dic = {}
        for i in range(n):
            dic[i]=i

        print(dic)

        for a,b in ids:
            i, j = self.find(dic, a), self.find(dic, b)
            if i<j:
                dic[j] = i
            else:
                dic[i] = j

        res = [dic[i] for i in range(n)]
        return list(set(res))

    def find(self, dic, i):
        while dic[i]!= dic[dic[i]]:
            dic[i]=dic[dic[i]]
        return dic[i]

ids = [[1,2], [2,3], [5,6]]
so = Solution()
ans = so.reduce(ids, 9)
print(ans)

P33 给一组integer数据, 和 target num, 返回这组数据 +,-,x, /能不能得到 target num,每个数用一次。

class Solution(object):
    def ifTarget(self, nums, target):
        return self.dfs(nums, '', target)

    def dfs(self, nums, path, target):

        if len(nums)==1:
            if nums[0]==target:
                print(path)
                return True
            else:
                False

        for i in range(len(nums)-1):
            for j in range(i+1, len(nums)):
                a, b = nums[i], nums[j]
                candidates = [a+b, a-b, a*b, b-a] + ([b/a] if a else [])  + ([a/b] if b else [])
                for c in candidates:
                    if self.dfs(nums[:i]+nums[i+1:j]+nums[j+1:] + [c], path + str(a) + str(b), target):
                        return True
        return False

nums = [1,2,3,4]
so = Solution()
ans = so.ifTarget(nums, 24)
print(ans)

P34 讲intern project,biggest challenge 是什么。 链接 问了database, index。 如何用几句话讲明白什么是index coding: maximal square

class Solution(object):
    def maximalSquare(self, matrix):
        """
        :type matrix: List[List[str]]
        :rtype: int
        """

        if not matrix or not matrix[0]:
            return 0

        dp = [[0]*len(matrix[0]) for _ in range(len(matrix))]

        for i in range(len(matrix)):
            dp[i][0] = matrix[i][0]
        for j in range(len(matrix[0])):
            dp[0][j] = matrix[0][j]

        res = 0
        for i in range(1, len(matrix)):
            for j in range(1, len(matrix[0])):
                if matrix[i][j]==1:
                    dp[i][j] = min(dp[i-1][j], dp[i-1][j-1], dp[i][j-1])+1
                    res = max(res, dp[i][j])

        return res**2

matrix =   [[1, 0, 1, 0, 0],
            [1, 0, 1, 1, 1],
            [1, 1, 1, 1, 1],
            [1, 0, 0, 1, 0]]


so = Solution()
ans = so.maximalSquare(matrix)
print(ans)

P35 大概讲讲实习经历。问了inverted index。 coding: Word Serach 2, word search 给个board 里面有字母,给个dictionary,search board里面上下左右走能不能找到这个词 做过了P13题 link

P36 聊简历,why yelp? 为什么你适合这个职位? 讲intern project,问garbage collection如何实现? 问了database index 是什么?如果有一个query 非常慢,为什么? 怎么找到原因。如何优化?如果是因为index的问题,解释为什么index影响query 速度。 coding: data stream return top k most frequent items (strings)

import heapq
class Solution(object):
    def __init__(self, k):
        self.q = []
        self.dic = {}
        self.k = k

    def add(self, num):

        if num not in self.dic:
            self.dic[num] = 1
        else:
            self.dic[num] += 1

        cnt = self.dic[num]
        if self.q and (cnt-1,num) in self.q:
            self.q.remove((cnt-1,num))
            self.q.append((cnt,num))
            heapq.heapify(self.q)
        else:
            if len(self.q)<self.k:
                heapq.heappush(self.q, (cnt, num))
            else:
                if cnt>self.q[0][0]:
                    heapq.heappop(self.q)
                    heapq.heappush(self.q, (cnt, num))
        return self.q

nums = [1,1,1,1,2,2,3,4,5,6,4,4,4,4,4,4]
so = Solution(3)
for i in nums:
    ans = so.add(i)
    print ans

P37 yelp有哪里需要improve?如何improve?需要收集什么数据?如何test 你的方法有效? 如何检查fraud,安全漏洞,或者安全问题。 coding: 给一个字符串“aBc1D2”, 其中的大小写可能不对,bool is_valid(string s) 函数,找到正确唯一的valid的字符串。

这都是什么面经啊!完全没懂什么意思!

P38 link 这部分之后是代码,leetcode的LRU cache,让我主要实现插入的逻辑。我就是hashmap加linked list,然后问了一下优化,说记录链表的尾巴可以加速插入。

import collections
class LRUCache(object):
    def __init__(self, capa):
        self.dic = collections.OrderedDict()
        self.capa = capa

    def get(self, key):
        if key in self.dic:
            value = self.dic.pop(key)
            self.dic[key] = value
            return value

    def set(self, key, val):
        if key in self.dic:
            self.dic.pop(key)
        elif len(self.dic)==self.capa:
            self.dic.popitem(last=False)
        self.dic[key]=val


so = LRUCache(5)
so.set(1,1)
so.set(2,2)
so.set(3,3)
so.set(4,4)
so.set(5,5)
so.set(6,6)
so.set(7,7)
print so.dic

P39 然后是一个华人女性,主要问了我缓存机制。然后问了给了好多课表,然后有先修课要求修完先修才能修后面的,就是一个dependency graph,然后考的就是topological sort。用一个hashmap记录每门课的indegree,码完问了一下时间复杂度。说是O(n^2),n是节点个数,这里不同的课程数。

import collections
class Solution(object):
    def findOrder(self, numCourses, prerequisites):
        """
        :type numCourses: int
        :type prerequisites: List[List[int]]
        :rtype: List[int]
        """

        pre = collections.defaultdict(set)
        nex = collections.defaultdict(set)
        for a,b in prerequisites:
            nex[b].add(a)
            pre[a].add(b)

        print(pre)
        print(nex)

        s = [i for i in range(numCourses) if i not in pre]
        visted = []
        while s:
            tmp = s.pop()
            visted.append(tmp)
            if tmp in nex:
                children = nex[tmp]
                for c in children:
                    pre[c].remove(tmp)
                    if not pre[c]:
                        s.append(c)

        return visted if len(visted)==numCourses else []

numCourses = 4
prerequisites = [[1,0],[2,0],[3,1],[3,2]]
so = Solution()
ans = so.findOrder(numCourses, prerequisites)
print(ans)

P40 第三个是一个manager,白人小哥。大哥感觉不是很钻技术的,上来主要跟我讲我是一个manager,主要和人打交道,然后问了问偏behavioral的像是平常做过项目里那次最challenging啊,实习里做的项目我没用过你能给我讲明白么,让你再做一次实习项目你会如何改进。说完之后问了一个很简单的anagram的题,就是找一堆单词里哪两个是anagram。sort单词以后作为key然后hash就行了。

import collections
class Solution(object):
    def findAnagram(self, words):
        """
        :type words: List[str]
        :rtype: List[str]
        """

        dic = {}

        for w in words:
            if tuple(sorted(w)) not in dic:
                dic[tuple(sorted(w))] = w
            else:
                return [w, dic[tuple(sorted(w))]]

        return []

words = ['abc', 'aaa', 'ccc', 'bca']
so = Solution()
ans = so.findAnagram(words)
print(ans)

P40 第四个是一个英国小哥,在公司十年了,感觉是tech lead,然后前面也是客套几句介绍公司,然后问了我一个网站如果相应速度很慢如何解决。上别的网课讲了如何提高网站性能,然后我就基本照着“当在地址栏里输入网址发生了什么”里面每一个步骤将可能发生的问题和相应的解决方案,说了很多,感觉他还很满意。然后问了我一个Word count的题目,要求求出一个单词stream里面最常出现的前十个,先说一个弱弱的把stream里单词变成键值对(key是单词value是出现次数)然后sort。问更好方法,说了用min heap,变成键值对后再放进堆里,堆深度一定时间变成线性的。 然后HR姐姐进来问了我是否有offer,然后问了细节。最让我开心的是她问了我有没有人可以做reference check,因为之前看到面经里表现不错要发offer的结束后都问了reference所以觉得应该还不错。送走之后等了两周HR打电话恭喜我拿到offer。

这道题写过,就不再写了。

import heapq
class Solution(object):
    def __init__(self, k):
        self.q = []
        self.dic = {}
        self.k = k

    def add(self, num):

        if num not in self.dic:
            self.dic[num] = 1
        else:
            self.dic[num] += 1

        cnt = self.dic[num]
        if self.q and (cnt-1,num) in self.q:
            self.q.remove((cnt-1,num))
            self.q.append((cnt,num))
            heapq.heapify(self.q)
        else:
            if len(self.q)<self.k:
                heapq.heappush(self.q, (cnt, num))
            else:
                if cnt>self.q[0][0]:
                    heapq.heappop(self.q)
                    heapq.heappush(self.q, (cnt, num))
        return self.q

nums = [1,1,1,1,2,2,3,4,5,6,4,4,4,4,4,4]
so = Solution(3)
for i in nums:
    ans = so.add(i)
    print ans

results matching ""

    No results matching ""