网易游戏的面试题与参考答案记录
JLL95
1 介绍课题
2 介绍进程跟线程,进程之间的通信
进程和线程的主要差别在于它们是不同的操作系统资源管理方式。
1)进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响;
2)而线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉
3)多进程的程序要比多线程的程序健壮;
4)但在进程切换时,耗费资源较大,效率要差一些。
5)对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。
进程之间的通信方式:
1)管道:进程与具有相同祖先进程的两个进程之间通信
2)命名管道:任意两个进程之间的通信,
3)消息队列:
4)内存映射:
5)套接字:
6)
3 http (get head post)udp tcp
4 数据库的连接方式,分别是怎么连接的?
5 课题遇到的问题,怎么解决的?
6 常用的python包有哪些?
1)GUI 图形界面: Tkinter,turtle
2)科学计算 :numpy;SciPy;pandas;randmon;sklearn
3)爬虫相关:scrapy;pyspider;selenium;requests;pysql
4)图像处理:pillow;matplotlib;skimage;CV2
5)其他:os模块就是对操作系统进行操作;time;加密hashlib;logging模块控制台输出日志;
6)接口测试相关:sys,urllib,json,base64,
7)字典:collections,operator
7 给定一串数组,判断数组中是否存在两个数之和等于给定的数
这个题其实很简单,面试的时候脑子里就想着,应该有什么比较好的方法,就把最基础的思路都没有说出来,唉傻到爆炸
思路:
遍历每两个数字,检查之和是否等于给定的Key,如果相等的话,返回True;否则返回False
注意:
不能写成
def issumin(array,key): for i in range(len(array)-1): for j in range(i+1,len(array)): if array[i]+array[j] == key: return True else: return False
因为这样的话,程序只会把第一个值和第二值相加,判断相等就True,不相等就False;不进行后面的判断
所以我们应该改成:当它两不相等的时候,退出当前循环,进入下一轮循环,当循环结束还有没相等,我们就在循环结束之后加一个return False;如果相等,直接返回True
def issumin(array,key): for i in range(len(array)-1): for j in range(i+1,len(array)): if array[i]+array[j] != key: continue else: return True return False array = [-1,3,2,7,0,-4,6] key = 8 print(issumin(array,key))
改进版
def find_numbers_with_sum(array,sum): array.sort() #res =[] add = 0 start = 0 end = len(array)-1 while(start<end): add = array[start]+array[end] if add>sum: end -=1 elif add<sum: start +=1 else: #res.extend([array[start],array[end]]) #return res return array[start],array[end] return [] print(find_numbers_with_sum([-1,3,2,7,0,-4,6],8))
算法复杂度是:O(n)
class Solution(object): def twoSum(self, nums, target): dic = {} for i, n in enumerate(nums): if n in dic: return [dic[n], i] dic[target-n] = i
8 输入一个整数列表,将连续的整数作为一组,只记录首尾,如[1,2,3,4,5,6]是一组,记录其首尾为[1,6],返回所有首尾的列表,没有返回空列表
思路:
首先进行排序,然后判断后一个减前一个等于1 ,继续往后走;否则,说明,连续的序列已经结束,将当前元素添加到列表中
这样的话,需要对最后一个进行特判,如果最后一个不连续,我们将它直接加到res中;如果连续先加到s中,再将s加到res中
注意:
1)这里需要设置一个start的flag,如果连续的子序列开始,需要将start置为非空;如果连续的子序列结束,需要将start置为空
2)只有子序列开始,和子序列结束时,才append;连续的中间元素没有必要append
def subset(array): res = [] start = None array.sort() for i in range(len(array)-1): if start == None: s = [] s.append(array[i]) start = 1 elif array[i]-array[i+1] != -1: s.append(array[i]) start = None res.append(s) if start == None: res.append(array[len(array)-1]) else: s.append(array[len(array)-1]) res.append(s) return res if __name__ == '__main__': a = [3,2,7,8,1,4,10,11,12,15] print(subset(a))
运行结果: runfile('C:/Users/Desktop/python/constant.py', wdir='C:/Users/Desktop/python') [[1, 4], [7, 8], [10, 12], 15]
9 逻辑题:在公路上观察一小时,有车经过的概率为96%,观察半小时,有车经过的概率为多少
10 给你一只铅笔,尽可能多的想出跟它相关的东西
11 平常玩什么游戏?
12 字符串转化成整数?
题目面试的时候都没怎么明白,只能说还需要成长
思路:
1)先判断字符串是不是以正负号打头的,如果是的话,分情况讨论;先获取字符串的符号,计算完成之后,按照正负号直接乘上去就行
2)如果字符串不是以正负号打头的,按每一位进行判断就是
注意:
1) 这里的ord('0')一定是要加引号的,而不是ord(0)
2) 需要将字符串进行反转,从最小的位置开始,每一位乘10,然后相加
def str2int(string): if string[0] == '+' or string[0] =='-': string1 = string[1:] res = 0 mul = 1 for i in reversed(string1): if ord('9') >= ord(i) >= ord('0'): res = res + mul*(ord(i)-ord('0')) mul *= 10 else: return False if string[0] == '+': return res else: return -1*res else: res = 0 mul = 1 for i in reversed(string): if ord('9') >= ord(i) >= ord('0'): res = res + mul*(ord(i)-ord('0')) mul *= 10 else: return False return res print(str2int('-12309'))
运行结果: runfile('C:/Users/Desktop/python/str2int.py', wdir='C:/Users/Desktop/python') -12309