Eric的新家

导航

机器学习面试总结(一)

       已经很久没有更新过博客,因为论文和自己的学习的事情,也因为自己的懒惰疏于书写。仿佛时间已经过去了很久,现在毕业了,因为一些原因没有参加秋招,而且也错过了春招,现在才开始到北京来面试找工作。寄居在同学这里,感谢他们的收留。第一家面试的公司是一家做K12的线上的公司,面试的题目不难,但是可能是第一次准备了很久,但是面试的时候感觉发挥的很差,自己的知识也确实不到位,所以,以后每次面试一家公司都要进行总结和学习,希望自己加油。

      进入正题吧。首先上来就是笔试做题,题目简单但是我都做得不是很好。

     题目1:定义一个哈希表的成员和方法。

这个题目我大致写了一下,还是写出来了,采用的线性散列的方式。面试官看了下感觉还行。下面结合网友的答案给出完整的实现。这是一个简单的哈希表的实现。

#实现哈希表(线性地址再散列)

def ChangeKey(key, m, di):
    key01 = (key+di) % m
    return key01

a = input("Please entry the numbers(split by space!):\n").split()
m = len(a)
dict01 = {}
for i in a:
    key = int(i) % m
    if "%s" % key in dict01:
   # 如果该键值已经在列表中存在,则改变该值,加一向后顺延
        NewKey = ChangeKey(key, m, 1)
        while "%s" % NewKey in dict01:         #因为下面的dict01的key值是以字符串来保存,因此这里作判断时也要用字符串格式
       # 如果新产生的键值也是重复的在此顺延一位
            NewKey = ChangeKey(NewKey, m, 1)
        dict01["%s" % NewKey] = int(i)
    else:
        dict01["%s" % key] = int(i)
print(dict01)


# 测试数据运行结果
Please entry the numbers(split by space!):
5 6 9 89 5 66 56 99
{'5': 5, '6': 6, '1': 9, '2': 89, '7': 5, '3': 66, '0': 56, '4': 99}

 要实现一个哈希表的成员和方法,首先需要定义一个类,然后要有初始化的方法,其次给定实现哈希表的方法。

 1 class LinearMap(object):
 2     """ 线性表结构 """
 3     def __init__(self):
 4         self.items = []
 5     
 6     def add(self, k, v):    # 往表中添加元素
 7         self.items.append((k,v))
 8     
 9     def get(self, k):       # 线性方式查找元素
10         for key, val in self.items:
11             if key==k:      # 键存在,返回值,否则抛出异常
12                 return val
13         raise KeyError

 此时在哈希表中查找一个元素的时间复杂度是O(logn)。python的内建数据类型:字典,就是用哈希表实现的。下面给出完整的实现。

class HashMap(object):
    def __init__(self):
        # 初始化总表为,容量为2的表格(含两个子表)
        self.maps = BetterMap(2)
        self.num = 0        # 表中数据个数
    
    def get(self,k):        
        return self.maps.get(k)
    
    def add(self, k, v):
        # 若当前元素数量达到临界值(子表总数)时,进行重排操作
        # 对总表进行扩张,增加子表的个数为当前元素个数的两倍!
        if self.num == len(self.maps.maps): 
            self.resize()
        
        # 往重排过后的 self.map 添加新的元素
        self.maps.add(k, v)
        self.num += 1
        
    def resize(self):
        """ 重排操作,添加新表, 注意重排需要线性的时间 """
        # 先建立一个新的表,子表数 = 2 * 元素个数
        new_maps = BetterMap(self.num * 2)
        
        for m in self.maps.maps:  # 检索每个旧的子表
            for k,v in m.items:   # 将子表的元素复制到新子表
                new_maps.add(k, v)
        
        self.maps = new_maps      # 令当前的表为新表

 

题目2:写一个方法输出1-100之间的素数。

就这个题目非常之简单但是我写错了各位老铁。哎。。。感觉脑袋是蒙的,后面面试官提示了我很久,才慢慢的写了出来。但是肯定是完了,觉得我逻辑和代码能力都差,也确实是如此,希望大家不要像我一样,引以为戒吧。

for i in range(1,101):
    if i == 1:
        print(i)
        continue
    for j in range(2,i):
        if i % j == 0:
            break
    else:
        print(i)

 题目3:给定一个数组,用快排实现升序排序。

def quick_sort(li, start, end):
    # 分治 一分为二
    # start=end ,证明要处理的数据只有一个
    # start>end ,证明右边没有数据
    if start >= end:
        return
    # 定义两个游标,分别指向0和末尾位置
    left = start
    right = end
    # 把0位置的数据,认为是中间值
    mid = li[left]
    while left < right:
        # 让右边游标往左移动,目的是找到小于mid的值,放到left游标位置
        while left < right and li[right] >= mid:
            right -= 1
        li[left] = li[right]
        # 让左边游标往右移动,目的是找到大于mid的值,放到right游标位置
        while left < right and li[left] < mid:
            left += 1
        li[right] = li[left]
    # while结束后,把mid放到中间位置,left=right
    li[left] = mid
    # 递归处理左边的数据
    quick_sort(li, start, left-1)
    # 递归处理右边的数据
    quick_sort(li, left+1, end)
 
if __name__ == '__main__':
    l = [6,5,4,3,2,1]
    # l = 3 [2,1,5,6,5,4]
    # [2, 1, 5, 6, 5, 4]
    quick_sort(l,0,len(l)-1)
    print(l)
    # 稳定性:不稳定
    # 最优时间复杂度:O(nlogn)
    # 最坏时间复杂度:O(n^2)
View Code

 阿里云新用户注册连接:欢迎大家使用。

https://www.aliyun.com/minisite/goods?userCode=ptv35lsk

posted on 2019-07-12 11:37  Eric的新家  阅读(311)  评论(0编辑  收藏  举报