我最近申请了一个后端职位,并被要求完成一个带回家面试的问题。我认为这个问题相当简单,我在大约一个小时内就完成了,尽管有人告诉我,这可能需要4个小时。
我最近得到了回复,说我的回答没有显示出所需的技能水平。回头看我的答案,我不太清楚我应该在哪里改进。
请看一看,看看你会怎么做。
最初的问题:
描述:一个主管正在使用
TaskManagementSystem来管理他的员工的任务。该系统可以添加用户,将任务分配给用户,并获得属于特定用户的任务(S)。限制:您不能修改user或task类。self.users和self.tasks在TaskManagementSystem中必须保持为列表。您可以引入新的方法和类变量。目标:
get_user_tasks()更改为返回任务名称列表,而不是任务对象。add_user()、add_task()和get_user_tasks()方法中添加错误处理TaskManagementSystem以处理大量用户和任务面试时提供的代码:
#!/usr/bin/envpython2.7#编码: utf-8类用户(对象):def __init__(self,user_id,name):‘任务对象。无法修改此代码。@ user_id: int @ name: string‘’self.user_id = user_id self.name = name class task( object ):def __init__(self,user_id,task_name):‘’任务对象。无法修改此代码。@ user_id: int @ task_name: string‘’self.user_id = user_id self.task_name = task_name class TaskManagementSystem(object):def __init__(self):self.users = [] #存储用户对象的列表self.tasks = [] #存储任务对象的列表user_name):“”添加一个新的用户@ user_name: string条件:每个用户都应该有一个惟一的名称,每个用户都应该在self.users: if user.user_id > unique_id: unique_中为用户设置一个唯一的id‘’unique_id =0。id = user.id self.users.append(用户(unique_id,(User_name) add_task(self,user_name,task_name):“”为用户添加任务@ user_name: string @ task_name: string条件:用户在self.users: if user.name = user_name: user_id = user中不应该有两个或多个具有相同名称‘’的任务。user_id self.users.append(任务(user_id,(Task_name) get_user_tasks(self,user_name):‘’获取任务(S),该任务属于指定用户名@ user_name: string‘’user_tasks = [],用于self.users: if user.name == user_name: for task in self.tasks: if task.user_id == user。user_id: user_tasks.append(任务)返回user_tasks如果__name__ == "__main__":tms = TaskManagementSystem() tms.add_user('Bob') tms.add_task('Bob‘)tms.add_task('Bob',‘杂货店’) tms.add_task('Bob',‘日托’)打印tms.get_user_tasks('Bob') #应该打印:洗衣,杂货店,日托
下面是我提交的作为我的答案的代码:
#!/usr/bin/env python2.7
# encoding: utf-8
from random import choice
class user(object):
def __init__(self, user_id, name):
'''
Task object. This code can not be modified.
@ user_id: int
@ name: string
'''
self.user_id = user_id
self.name = name
class task(object):
def __init__(self, user_id, task_name):
'''
Task object. This code can not be modified.
@ user_id: int
@ task_name: string
'''
self.user_id = user_id
self.task_name = task_name
class TaskManagementSystem(object):
def __init__(self):
self.users = [] # stores a list of user objects
self.tasks = [] # stores a list of task objects
def add_user(self, user_name):
'''
Add a new user
@ user_name: string
Condition:
Every user should have a unique name
Every user should have a unique id
'''
# Create a unique id based on current user list.
if self.users:
unique_id = max([_user.user_id for _user in self.users]) + 1
# There are no current users.
else:
unique_id = 1
# Check that user_name is not taken.
if [_user for _user in self.users if _user.name == user_name]:
print 'That user name is taken.'
else:
self.users.append(user(unique_id, user_name))
def add_task(self, user_name, task_name):
'''
Add a task for a user
@ user_name: string
@ task_name: string
Condition:
The user should not have two or more tasks with the same name
'''
user_id = self.get_user_id(user_name)
if not user_id:
return
if task_name in self.get_user_tasks(user_name):
print 'The user has already been asigned this task.'
else:
self.tasks.append(task(user_id, task_name))
def get_user_id(self, user_name):
'''
Get a users id.
Prints error if not found.
@ user_name: string
'''
try:
return [_user.user_id for _user in self.users
if _user.name == user_name][0]
except(IndexError):
print 'User not found.'
def get_user_tasks(self, user_name):
'''
Get task(s) that belongs to the specified user name
@ user_name: string
'''
user_id = self.get_user_id(user_name)
if not user_id:
return
return [_task.task_name for _task in self.tasks
if _task.user_id == user_id]
def test_add_users(n):
'''
Test by adding n users.
@ n: int
'''
print 'adding users...'
for x in xrange(n):
user_name = ''.join([chr(choice(range(97, 123))) for c in range(4)])
tms.add_user(user_name)
n_added = len(tms.users)
print '{} users added. {} user names rejected.'.format(n_added, n - n_added)
def test_add_tasks(n):
'''
Test by assigning random users tasks.
@ n: int
'''
print 'adding tasks...'
for x in xrange(n):
user_name = choice(tms.users).name # Grabs a random user's name
task_name = ''.join([chr(choice(range(97, 123))) for c in range(4)])
tms.add_task(user_name, task_name)
n_added = len(tms.tasks)
print '{} tasks added. {} task rejected.'.format(n_added, n - n_added)
if __name__ == "__main__":
tms = TaskManagementSystem()
# Test with lots of users.
# test_add_users(10000)
# test_add_tasks(10000)
tms.add_user('Bob')
tms.add_task('Bob', 'laundry')
tms.add_task('Bob', 'grocery')
tms.add_task('Bob', 'daycare')
print tms.get_user_tasks('Bob')
# should print: ['laundry', 'grocery', 'daycare']发布于 2016-03-14 21:00:43
让我们依次处理这四点:
None --这不是一个列表,可能被解释为用户存在,并且没有分配任何任务,这是错误的。您应该抛出一个UserNotFound异常(参见下面)。这是对列表理解的一个很好的使用,但是如果你有很多任务的话,你会很慢(同样,见下文)。try … except),您应该抛出适当的异常。例如:如果我试图添加一个已经存在的用户,您的add_user方法可能会引发DuplicateUser异常。这对于控制流更有用。您的错误信息可能更具体--虽然很明显,我试图重新添加哪个用户--添加了一个小脚本,它显示在一个大量的日志文件中,但是如果知道哪个用户被添加了两次,那就太好了。这对调试很有用。_users和_tasks,并添加返回正确列表的属性users和tasks。这样就保留了公共接口,但是您的实现效率更高。为此,您需要使用@property和@foo.setter装饰器--并不是完全微不足道,但也不是不可能的。我不是这个面试小组的成员,但关键的错误似乎是错误处理(使用异常,而不是打印)和缺乏有意义的更改来提高可伸缩性。
还有其他一些我发现的小事情:
user和task类的名称应该是CamelCase。user对象的docstring不正确。这是你故意犯的错误吗?add_user()方法根据现有的用户ID分配用户ID。如果稍后添加一个delete_user()方法(例如:创建用户'alice‘(id 1)创建用户'bob’(id 2)删除用户'bob‘(id 2)在不同的时间点创建用户'carol’(id 2),我有两个ID相同的用户,这可能会导致混淆。如果It是相当独特的,那就太好了。也许用hash(name)?except是一个语句,而不是一个函数。user或task对象,所以这是次要的:这两个对象可以被名元组替换,具有多个优点:https://codereview.stackexchange.com/questions/122849
复制相似问题