用于解答算法题目的Python3代码框架作者:杜逸先

前言

最近在实习,任务并不是很重,就利用闲暇时间使用Python3在PAT网站上刷题,并致力于使用Python3的特性和函数式编程的理念,其中大部分题目都有着类似的输入输出格式,例如一行读入若干个数字,字符串,每行输出多少个字符串等等,所以产生了很多重复的代码。

Python代码

于是我就利用VS Code的代码片段功能编写了一个用于处理这些输入输出的代码框架,并加入了测试功能(写函数前先写测试时正确的事情)。代码如下:


  1. """Simple Console Program With Data Input And Output.""" 
  2. import sys 
  3. import io 
  4.  
  5.  
  6. def read_int(): 
  7.     """Read a seris of numbers.""" 
  8.     return list(map(int, sys.stdin.readline().split())) 
  9.  
  10.  
  11. def test_read_int(): 
  12.     """Test the read_int function""" 
  13.     test_file = io.StringIO("1 2 3\n") 
  14.     sys.stdin = test_file 
  15.     assert read_int() == [1, 2, 3], "read_int error" 
  16.  
  17.  
  18. def read_float(): 
  19.     """Read a seris of float numbers.""" 
  20.     return list(map(float, sys.stdin.readline().split())) 
  21.  
  22.  
  23. def test_read_float(): 
  24.     """Test the read_float function""" 
  25.     test_file = io.StringIO("1 2 3\n") 
  26.     sys.stdin = test_file 
  27.     assert read_float() == [1.0, 2.0, 3.0], "read_float error" 
  28.  
  29.  
  30. def read_word(): 
  31.     """Read a seris of string.""" 
  32.     return list(map(str, sys.stdin.readline().split())) 
  33.  
  34.  
  35. def test_read_word(): 
  36.     """Test the read_word function""" 
  37.     test_file = io.StringIO("1 2 3\n") 
  38.     sys.stdin = test_file 
  39.     assert read_word() == ["1", "2", "3"], "read_word error" 
  40.  
  41.  
  42. def combine_with(seq, sep=' ', num=None): 
  43.     """Combine list enum with a character and return the string object""" 
  44.     res = sep.join(list(map(str, seq))) 
  45.     if num is not None: 
  46.         res = str(seq[0]) 
  47.         for element in range(1, len(seq)): 
  48.             res += sep + \ 
  49.                 str(seq[element]) if element % num != 0 else '\n' + \ 
  50.                 str(seq[element]) 
  51.     return res 
  52.  
  53.  
  54. def test_combile_with(): 
  55.     """Test the combile_with function.""" 
  56.     assert combine_with([1, 2, 3, 4, 5], '*', 2) == """1*2 3*4 5""", "combine_with error." 
  57.  
  58.  
  59. def main(): 
  60.     """The main function.""" 
  61.     pass 
  62.  
  63.  
  64. if __name__ == '__main__': 
  65.     sys.exit(int(main() or 0)) 

VS Code代码片段

添加到VS Code的默认代码片段的操作大致如下:

文件->首选项->用户代码片段,选择Python

编辑"python.json"文件如以下内容:


  1. /* 
  2.    // Place your snippets for Python here. Each snippet is defined under a snippet name and has a prefix, body and  
  3.    // description. The prefix is what is used to trigger the snippet and the body will be expanded and inserted. Possible variables are: 
  4.    // $1, $2 for tab stops, ${id} and ${id:label} and ${1:label} for variables. Variables with the same id are connected. 
  5.    // Example: 
  6.    "Print to console": { 
  7.       "prefix": "log", 
  8.       "body": [ 
  9.           "console.log('$1');", 
  10.           "$2" 
  11.       ], 
  12.       "description": "Log output to console" 
  13.   } 
  14. */ 
  15. "Simple Console Program With Data Input And Output": { 
  16.       "prefix": "simple", 
  17.       "body": ["\"\"\"Simple Console Program With Data Input And Output.\"\"\"\nimport sys\n\ndef read_int():\n \"\"\"Read a seris of numbers.\"\"\"\n return list(map(int, sys.stdin.readline().split()))\n\n\ndef read_float():\n \"\"\"Read a seris of float numbers.\"\"\"\n return list(map(float, sys.stdin.readline().split()))\n\n\ndef read_word():\n \"\"\"Read a seris of string.\"\"\"\n return list(map(str, sys.stdin.readline().split()))\n\n\ndef combine_with(seq, sep=' ', num=None):\n \"\"\"Combine list enum with a character and return the string object\"\"\"\n res = sep.join(list(map(str, seq)))\n if num is not None:\n res = str(seq[0])\n for element in range(1, len(seq)):\n res += sep + str(seq[element]) if element % num != 0 else '\\n' + str(seq[element])\n return res\n\n\ndef main():\n \"\"\"The main function.\"\"\"\n pass\n\n\nif __name__ == '__main__':\n sys.exit(int(main() or 0))\n" 
  18.       ], 
  19.       "description": "Simple Console Program With Data Input And Output" 
  20.   } 

总结

虽然Python不是特别适合解答算法题目这种性能要求很高的场景,但是在一些模拟题目如各种排队型和字符串处理的条件下,使用Python可以极大地提高解体效率,另外还可以使用cimport使用C语言的数据结构和Python的语法特性,效率不弱于原生C代码。

作者:杜逸先

来源:51CTO

时间: 2024-09-17 11:58:04

用于解答算法题目的Python3代码框架作者:杜逸先的相关文章

一个小岛-眼睛的颜色 算法题我的代码为什么不能通过???一个岛上有n个人

问题描述 眼睛的颜色 算法题我的代码为什么不能通过???一个岛上有n个人 一个岛上有n个人,每个人的眼睛要么是蓝色的,要么是黑色的,并且至少有一个人眼睛是蓝色的.每个人都知道至少一个人眼睛是蓝色的事实,但是不知道具体几个人眼睛是蓝色的.每天所有人互相见面,他们可以看到别人的眼睛的颜色,但是看不到自己眼睛的颜色.别人也不能告诉他眼睛的颜色.如果一个人推断出自己的眼睛是蓝色的,他就会在当天离开.求每个人离开在第几天. 输入格式: 多组数据,每组数据第一行是一个正整数n,表示人数.(2<=n<=10

轮询算法设计及其代码框架

在实际的软件开发项目中,经常会遇到某模块需要向其它模块发消息的情况.为了减轻消息接收者的负担,我们会采用一种叫做轮询的机制来发送消息.本文介绍轮询算法的流程及其代码框架. 1.算法流程 假设消息发送模块为模块A,消息接收模块为模块B.模块A安装了一个,模块B安装了N个.所有模块都同时启动. 算法流程如图1所示: 图1 轮询算法流程 2.代码框架 static int g_iSendIdx = 0; for (iLoopFlag = 0; iLoopFlag < N; iLoopFlag ++)

基础算法题,求思路和代码

问题描述 基础算法题,求思路和代码 问题 E: L1-6. 连续因子 时间限制: 1 Sec 内存限制: 128 MB 题目描述 一个正整数N的因子中可能存在若干连续的数字.例如630可以分解为3*5*6*7,其中5.6.7就是3个连续的数字.给定任一正整数N,要求编写程序求出最长连续因子的个数,并输出最小的连续因子序列. 输入 输入在一行中给出一个正整数N(1<N<231). 输出 首先在第1行输出最长连续因子的个数:然后在第2行中按"因子1*因子2*--*因子k"的格式

c++-算法题。已知两个平行四边形各自的四个点,求这两个平行四边形是否有交集!用代码如何实现?

问题描述 算法题.已知两个平行四边形各自的四个点,求这两个平行四边形是否有交集!用代码如何实现? 算法题.已知两个平行四边形各自的四个点,求这两个平行四边形是否有交集!用代码如何实现? 解决方案 计算角度有点复杂,或许可以考虑判断点在两对平行线之间.判断点位于一对平行线之间(一条线上,一条线下):将点代入一对平行线方程,判断L1(x,y)*L2(x,y)<=0. 解决方案二: 如果两个平行四边形相交,那么一个四边形中必然有一个顶点位于令一个四边形的内部. 而判断一个点P是否在一个平行四边形ABC

编码-poj 2058算法题Word Encoding完整代码

问题描述 poj 2058算法题Word Encoding完整代码 题目描述 In any language, certain combinations of letters do not appear (or at least appear so seldom that they can be considered non-existent). For instance, there are no English words containing the three letter combin

javascript算法题:求任意一个1-9位不重复的N位数在该组合中的大小排列序号

 具体题目是这样的: 从1--9中选取N个数字,组成不重复的N位数,从小到大进行编号,当输入其中任何一个数M时,能找出该数字对应 的编号.如 N=3,M=213. 输出:[123(1) , 132(2) , 213(3) , 231(4) , 312(5) , 321(6)]--->X=2 首先看到题目想到的是生成一个从少到大的全排列的数组,然后再遍历数组得到对应的序号(数组下标加1),又或者想到一个个从小到大的生成push进数组,然后判断该数是不是当前题目给的数,如果是的话要求的序号就是当前数

经典算法题每日演练——第十五题 并查集

原文:经典算法题每日演练--第十五题 并查集     这一篇我们看看经典又神奇的并查集,顾名思义就是并起来查,可用于处理一些不相交集合的秒杀. 一:场景     有时候我们会遇到这样的场景,比如:M={1,4,6,8},N={2,4,5,7},我的需求就是判断{1,2}是否属于同一个集合,当然实现方法 有很多,一般情况下,普通青年会做出O(MN)的复杂度,那么有没有更轻量级的复杂度呢?嘿嘿,并查集就是用来解决这个问题的.   二:操作   从名字可以出来,并查集其实只有两种操作,并(Union)

经典算法题每日演练——第六题 协同推荐SlopeOne 算法

原文:经典算法题每日演练--第六题 协同推荐SlopeOne 算法               相信大家对如下的Category都很熟悉,很多网站都有类似如下的功能,"商品推荐","猜你喜欢",在实体店中我们有导购来为我们服务,在网络上 我们需要同样的一种替代物,如果简简单单的在数据库里面去捞,去比较,几乎是完成不了的,这时我们就需要一种协同推荐算法,来高效的推荐浏览者喜 欢的商品. 一:概念      SlopeOne的思想很简单,就是用均值化的思想来掩盖个体的打

经典算法题每日演练——第八题 AC自动机

原文:经典算法题每日演练--第八题 AC自动机        上一篇我们说了单模式匹配算法KMP,现在我们有需求了,我要检查一篇文章中是否有某些敏感词,这其实就是多模式匹配的问题. 当然你也可以用KMP算法求出,那么它的时间复杂度为O(c*(m+n)),c:为模式串的个数.m:为模式串的长度,n:为正文的长度,那 么这个复杂度就不再是线性了,我们学算法就是希望能把要解决的问题优化到极致,这不,AC自动机就派上用场了.    其实AC自动机就是Trie树的一个活用,活用点就是灌输了kmp的思想,从