【面试题】网易互娱(游戏)2021校园招聘在线笔试 - 服务端开发工程师[文件系统]

昨晚做网易互娱的笔试,比较尴尬的是只能用C/C++/Java,而本人对C/C++的了解仅限于大一的课程设计(而且一年多没用过C写代码了),Java差不多看得懂代码但是没有系统的学过。无奈最后只能用python写了两道题,再用C照着python的语法写了一遍(然而提交没通过,基本上是凉凉了)

第二题:

题目其实就是模拟一个文件系统的简单实现,对文件系统机制有过了解的话还是很容易看懂题目的。

首先定义一个列表 file[] 模拟文件流,定义一个列表hui_shou[]记录被回收的文件描述符 ,定义一个全局变量cj表示下一个文件描述符

open操作,相当于往文件流中增加一个文件描述符,可以用一个字典来表示{"文件描述符" : "文件名(文件地址)"},返回值为新增字典的文件描述符。注意,如果暂无文件描述符被回收(即当前无文件关闭,hui_shou=[]),那么增加的文件描述符为cj,否则先将已被回收的文件描述符重新利用

(用字典表示是因为字典的key唯一而value不唯一,方便后续dup、dup2操作)

dup操作,相当于有一个新用户打开一个已经被打开且尚未关闭的文件,还是向文件中添加一个字典,返回值为新字典的文件描述符

dup2操作,操作基本同上,只是强制设定了新字典的文件描述符,不用系统自动分配

query操作,通过文件描述符返回对应的文件名(文件地址)

close操作,关闭文件,将对应的字典从文件流中移除,并将被移除的文件描述符添加至hui_shou[]

python代码如下:

t = int(input())
data = []
for hahaha in range(t):                             
    c_j = []
    n = int(input())
    for i in range(n):
        c_j.append(list(input().split(" ",1)))      #只切割一次,方便后续eval函数调用
    data.append(c_j)

def open(filename):
    global cj                                       #待加入的文件描述符
    global file                                     #文件流
    global hui_shou                                 #回收流
    if hui_shou:
        n = hui_shou.pop()                          #弹出最近被回收的文件描述符
        file['{}'.format(n)] = filename             #加入文件流
        print(n)
    else:
        file['{}'.format(cj)] = filename            
        cj += 1
        print(cj-1)

def dup(num):
   global file
   global cj
   global hui_shou
   if hui_shou:
       n = hui_shou.pop()
       file['{}'.format(n)] = file['{}'.format(int(num[0]))]
       print(n)
   else:
       file['{}'.format(cj)] = file['{}'.format(int(num[0]))]
       cj += 1
       print(cj - 1)


def dup2(num):
    n = num[0].split(" ")                           #由于有两个参数,故还需进行一次切割
    global file
    file["{}".format(int(n[1]))] =file["{}".format(int(n[0]))]  

def close(num):
    global file
    global hui_shou
    del file["{}".format(int(num[0]))]
    hui_shou.append(int(num[0]))

def query(num):
    global file
    print(file["{}".format(int(num[0]))][0])


for j in range(t):
    cj = 0
    hui_shou = []
    file = {}
    for i in range(len(data[j])):
        eval("{}".format(data[j][i][0]))(data[j][i][1:])  #通过字符串来调用函数


#以下是测试样例
# 2
# 10
# open libc.so
# open libm.so
# open libdl.so
# dup 2
# dup2 0 2
# close 0
# query 1
# query 2
# query 3
# open log.txt
# 10
# open output.txt
# dup2 0 1000000
# close 0
# open output2.txt
# dup2 0 100000
# close 0
# open 1.txt
# dup 100000
# query 1
# query 0

由于博主是拿python实现的,用C语言重写时又没写出来,故没能进入系统测评,只能拿题目中给出的样例进行测评(样例通过无误),故有两个地方无法确定写法:

1. 需不需要实现文件描述符自动回收重用机制【题中样例并不涉及自动重用被回收的文件描述符,dup2是手动重用】(本人代码中已实现自动重用)

2. 回收流是采用的队列还是栈【先进先出还是后进先出】(本人代码中是利用栈实现,如需队列实现可以考虑 “出入栈”)

 

第三、四题太长了没来得及截图,第四题也没来得及写。

第三题是关于神经网络的,第四题好像与地球有关(经纬度?!公转自转?!)

如果哪位老哥有后面三题(有第2、3、4题的测试用例更好)且不吝分享的话可以私我一下,谢谢啦~

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值