大家好,我是吴师兄。
对于大部分小伙伴来说,刷算法题基本上是在 LeetCode 上进行的。
但很多时候笔试、机试的时候却并不是让你打开 LeetCode 做题,而是在招聘公司自己的平台或者第三方平台比如牛客网上进行,这种做题的模式俗称 ACM 模式。
虽然同样都是算法题,但无论是提交方式还是代码编写方式,不同平台上都存在着一些差异性。
如果你是第一次接触 ACM 模式,很有可能哪怕之前刷了几百道 LeetCode 也有可能面对一道简单的算法面试题,不知道如何下手。
那么,今天吴师兄就简单分享一下算法面试中的 ACM 模式怎么准备。
直接给出结论,ACM 模式与核心代码模式两者的区别可以通过以下表格看出些许端倪。
核心代码模式 | ACM模式 | |
---|---|---|
出现场景 | LeetCode | 牛客,大部分大厂考试,自己的IDE |
输入 | 用函数传参的方式传入参数传入的变量一般无需再做数据类型的转换 | 用input()的方式输入参数需要用split()或map()等函数得到合适的数据类型 |
输出 | 使用return返回答案在代码中任意位置均可以return | 使用print()输出答案在代码最后进行print() |
如果要在自己的 IDE 上使用这两种不同的模式进行调试,以 LeetCode 150、逆波兰表达式为例,可以参考以下两种不同的代码。
核心代码模式
代码语言:javascript复制'''
以下内容,在LeetCode中是需要补充完成的部分
'''
#创建类
class Solution:
# 实现Solution类的核心方法evalRPN(self, tokens)
def evalRPN(self, tokens):
stack = list() # 初始化一个栈stack
for ch in tokens: # 遍历tokens列表中的所有元素ch
if ch == " ": # 当ch为" "号
n1 = stack.pop() # 将stack中最后两个元素弹出后相加,再压入栈中
n2 = stack.pop()
stack.append(n2 n1)
elif ch == "-": # 当ch为"-"号
n1 = stack.pop() # 将stack中最后两个元素弹出后相减,再压入栈中
n2 = stack.pop()
stack.append(n2-n1)
elif ch == "*": # 当ch为"*"号
n1 = stack.pop() # 将stack中最后两个元素弹出后相乘,再压入栈中
n2 = stack.pop()
stack.append(n2*n1)
elif ch == '/': # 当ch为"/"号
n1 = stack.pop() # 将stack中最后两个元素弹出后相除,再压入栈中
n2 = stack.pop()
stack.append(int(n2/n1)) # 注意要使用int(n2/n2)令结果整除
else:
stack.append(int(ch)) # 当ch为数字,将其压入栈中
return stack[0] # 运算到最后,栈中只剩下一个数字,即为答案
'''
以下内容,在LeetCode中是在系统后台自动调用的
'''
# 创建输入的tokens
tokens = input().split()
# 创建Solution类的一个实例对象sol
sol = Solution()
# 调用对象sol中的方法,将tokens作为参数传入evalRPN()方法中
ans = sol.evalRPN(tokens)
# 输出答案
print(ans)
ACM模式
代码语言:javascript复制
'''
以下内容,在牛客或 OD 考试中均要自己实现
'''
# 创建输入的tokens
tokens = input().split()
stack = list() # 初始化一个栈stack
for ch in tokens: # 遍历tokens列表中的所有元素ch
if ch == " ": # 当ch为" "号
n1 = stack.pop() # 将stack中最后两个元素弹出后相加,再压入栈中
n2 = stack.pop()
stack.append(n2 n1)
elif ch == "-": # 当ch为"-"号
n1 = stack.pop() # 将stack中最后两个元素弹出后相减,再压入栈中
n2 = stack.pop()
stack.append(n2-n1)
elif ch == "*": # 当ch为"*"号
n1 = stack.pop() # 将stack中最后两个元素弹出后相乘,再压入栈中
n2 = stack.pop()
stack.append(n2*n1)
elif ch == '/': # 当ch为"/"号
n1 = stack.pop() # 将stack中最后两个元素弹出后相除,再压入栈中
n2 = stack.pop()
stack.append(int(n2/n1)) # 注意要使用int(n2/n2)令结果整除
else:
stack.append(int(ch)) # 当ch为数字,将其压入栈中
# 运算到最后,栈中只剩下一个数字,即为答案
print(stack[0])
你也可以将主要的算法逻辑封装一个函数,再在主体部分中调用。这样的写法更加贴近核心代码模式,也体现了程序设计的封装思想。
代码语言:javascript复制'''
以下内容,在牛客或OD考试中均要自己实现
'''
# 定义函数evalRPN(),在主体部分中调用
def evalRPN(tokens):
stack = list() # 初始化一个栈stack
for ch in tokens: # 遍历tokens列表中的所有元素ch
if ch == " ": # 当ch为" "号
n1 = stack.pop() # 将stack中最后两个元素弹出后相加,再压入栈中
n2 = stack.pop()
stack.append(n2 n1)
elif ch == "-": # 当ch为"-"号
n1 = stack.pop() # 将stack中最后两个元素弹出后相减,再压入栈中
n2 = stack.pop()
stack.append(n2-n1)
elif ch == "*": # 当ch为"*"号
n1 = stack.pop() # 将stack中最后两个元素弹出后相乘,再压入栈中
n2 = stack.pop()
stack.append(n2*n1)
elif ch == '/': # 当ch为"/"号
n1 = stack.pop() # 将stack中最后两个元素弹出后相除,再压入栈中
n2 = stack.pop()
stack.append(int(n2/n1)) # 注意要使用int(n2/n2)令结果整除
else:
stack.append(int(ch)) # 当ch为数字,将其压入栈中
# 运算到最后,栈中只剩下一个数字,即为答案,需要return ans
return stack[0]
# 创建输入的tokens
tokens = input().split()
# 将tokens作为参数传入evalRPN()函数中,并返回ans
ans = evalRPN(tokens)
# 输出ans变量
print(ans)
以上就是 ACM 模式的一些介绍,仔细阅读一遍就能掌握,并且大家不用过于纠结核心代码模式和 ACM 模式的区别,我们的学习重点主要还是算法和逻辑层面。
如果你自己想刻意的练习 ACM 模式,一方面可以在牛客网上练习,一方面也可以在我们的 OJ 平台进行练习,目前网站上已经上传了非常多的 ACM 模式的算法题,建议在在算法面试前多多练习。