笔试编程框架总结!

Datawhale

共 2972字,需浏览 6分钟

 ·

2021-05-20 02:31

↑↑↑关注后"星标"Datawhale
每日干货 & 每月组队学习,不错过
 Datawhale干货 
作者:吴忠强,东北大学,Datawhale成员

前面的话

经历面试前,我一直埋头刷题,到了面试才发现,没有一套应对真实环境的编程框架,有孙悟空的本事也使不出来,憋得难受。

痛定思痛,觉得要是早点有人告诉我就好了,整理下来,大家就不用再经历我当时的憋屈。

为什么要面试专用编程框架

在上篇刷LeetCode的六大误区中有提到,笔试做题用的是纯白板编程,要自己写输入输出。这个是和平时LeetCode上的刷题有很大区别,牛客上有真实的编程模式叫ACM,可以用来练习。

这个编程环境长啥样?我在牛客上截了个图:


笔试时,就是面对这个东西编程。现在看着还没啥,到了面试黑窗上再放个计时器,我滴妈,立马肾上腺素飙升。下面整理我对于这个窗口悟到的编程框架。

纯白板模式下的编程框架

首先,拿到黑窗口后,二话不说,直接把下面这段代码写上, 强调:尽量用IDE!,这样不同的大题,复制粘贴就完事,真正帮你节约大把时间来思考题目。

import sys

# 这里写解决问题的代码,和LeetCode就完全一样了
def solve(arr):
 pass


if __name__ == '__main__':

 # 接收输入的逻辑,这里先把输入接收过来, 两种选择input()和sys.stdin.readline()
 group_nums = input()   #字符串形式,得转成int
 
 group_nums = int(group_nums)
 
 # 对于每一组
 for i in range(group_nums):
  # 接收每一组的输入, 这里不同的题目就不一样了,但一定记住我们接收的还是一行,这是一个字符串
  arr = sys.stdin.readline().strip().split(' ')
  # 元素转成int
  arr = list(map(int, arr))

  # 输入接收过来之后,这里最好打印下看看接收的是不是正确,这个很重要
  # print(arr)

  # 处理具体的问题了
  res = solve(arr)

  # 输出结果
  print(res)  

上面这个模板,处理的是多组输入,或者多行输入;如果是一组输入,仅仅几行的话, 就不用外层for循环的, 一行行的接收即可。

框架模板的优势

这个框架做到了主函数与处理问题的逻辑分离开。接收输入 -> 处理函数 -> 调整输出即可。 这么一来,我们在solve里就可以像在LeetCode上一样,直接写解决问题的函数。这样的代码看起来清晰,找bug时也好找。

另外,就是一定要重视低耦合高内聚的编程技巧。如果遇到处理不同的事情,尽量的写成函数的方式,这样调试起来会更加简洁。

框架模板的注意点

逻辑通了,下面是细节上要注意的。首先是,接收输入时都是一行一行地接收,这个是字符串形式,要先接收过来,再转换格式。我个人习惯是先都接收了,然后统一转换格式,比较清晰。只要保证接收正确,大家也可以在接收时直接转。

这里主要整理接收intput()sys.stdin.readline()两种方式的区别。这两个都是字符串格式,读入一行,区别是后者会带着一个换行符\n。啥意思?我们在输入时,是把输入输完之后,敲一个回车告诉编译器我敲完了。这俩的区别就是input()会过滤掉最后的回车,而sys.stdin.readline()会带着后面的回车。

一个最简单的例子:

arr = sys.stdin.readline().split(' ')
print(arr)    # ['1', '2', '3', '4', '5\n']

arr = input().split(' ')
#arr = sys.stdin.readline().split(' ')
print(arr)      # ['1', '2', '3', '4', '5']

可以发现,如果用上面那个代码,接收的输入可能是不正确的。比如,有时用下面这个代码把每个元素转成int时,会出现一些不知名的错误:

list(map(int ,arr))

比如这样的错误:

哈哈, 这里是我输入时最后不小心多敲了个空格, 按照空格切分,把换行符单独切成了一个元素,int转换保留了这个错误。所以,如果想用sys接收输入的话,更加鲁棒性的代码是:

arr = sys.stdin.readline().strip().split(' ')

也就是加一个strip函数去掉多余的空格或者换行符。还有一种鲁棒性的写法:

arr = input().strip().split(' ')

这两个写法都可以, 建议用input。

同样的输出也有两种方式:

# sys.stdout.write(''.join(arr))
# print(''.join(arr))

这俩的区别是sys的那种,最后不会加一个换行,而print我们知道,输出完毕之后,会自动加一个换行符。建议还是print吧,花里胡哨的多了,就容易出错。

好了, 有了这样的一个框架,就把ACM模式转成了我们常用的LeetCode模式了。最后再次强调IDE的重要性:自动补全,调试,保存代码都非常方便。

总结

确实,有些坑,得需要自己去趟、去试, 可千万不能小马过河。接下来这段时间,我们一起再抓住最后一点机会,去试错。过于谨慎和完美主义,往往会错失良机。

秋招在即,六月一定得赶早准备。现在大部分公司感觉都满员了,压力和竞争越来越大,又到了暴风雨前的宁静,接下来,继续加油, Rush!

整理不易,三连
浏览 41
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报