
程序员的算法趣题(python解法)
对《程序员的算法趣题》中的问题利用python求得答案
秋水中的鱼
这个作者很懒,什么都没留下…
展开
-
程序员的算法趣题(python解法)-09:不缠绕的纸杯电话
问题解题思路dp[i]表示一共有i对小朋友时可能的结对方式。假设当前考虑的是第i对,x是第i对最右边的那个人,只有与x相邻或者与x之间隔了偶数个人的小朋友才能与x相连。这样x和与x相连的小朋友就把所有小朋友分成了两部分,其中一部分的对数为j,另一部分的对数就为i-j-1,这两部分的情况排列组合一共有dp[j]*dp[i-j-1]种。所以现在关键在于找到j的取值规律。按逆时针方向(顺时针也行)考虑所有能与x相连的小朋友,他们两个人把所有小朋友反正两个部分后,易知其中一部分的对数j的范围是0到i-1。原创 2021-02-10 21:45:58 · 162 阅读 · 0 评论 -
程序员的算法趣题(python解法)-08:受难立方魔方阵
问题解题思路dp[j]表示和为j的情况下总共可能出现的次数。一开始没有数字和为0,所以dp[0]=1代表和为0的出现次数为1。之后增量地考虑这些数字,即每次考虑新增一个数字的情况。设该数字为i,则当前所有dp[j]的值都需相应的加给dp[j+i]。代码nums=[1,14,14,4,11,7,6,9,8,10,10,5,13,2,3,15]dp=[0]*(sum(nums)+1)dp[0]=1largest=0for i in nums: for j in range(larg原创 2021-02-08 23:58:37 · 242 阅读 · 0 评论 -
程序员的算法趣题(python解法)-07:水果酥饼日
问题解题思路假设第一块蛋糕的值为1,后面每块蛋糕的值与前一块蛋糕的值之和为完全平方数。当分到最后一块蛋糕时,确保其与第一块蛋糕的值之和也为完全平方数,至此,此题得解。代码def dfs(pre,n,visited,square,res): if len(visited)==n: return res if pre+1 in square else False for i in range(2,n+1): if i not in visited an原创 2021-02-06 22:23:49 · 708 阅读 · 0 评论 -
程序员的算法趣题(python解法)-06:走楼梯
问题解题思路方法一:递归递归终止条件为A和B相遇或者A已经超越了B。否则就分别枚举他们两个人走楼梯的级数的所有可能情况。方法二:动态规划这一问题可以转换为求A走了偶数次后到达楼顶的情况数。因为假设A走了2xxx后到达楼顶,则可以视作A走了xxx次的同时B也走了剩余的xxx次,这时他们必定会相遇。故可以用动态规划求解,dp[j]表示当A到达j点时走了i次时的所有的可能情况数。代码中直接用了滚动数组的方式优化了空间复杂度,所以用的一维数组,滚了10次,取其中偶数次的dp[10]。代码方法一原创 2021-02-05 23:38:27 · 281 阅读 · 3 评论 -
程序员的算法趣题(python解法)-05:有多少种满足字母算式的解法
问题解题思路先提取出所有不重复的字母,再给这些字母分配数字,把分配完的数字代回原表达式中,用eval验证新表达式,若返回True,则符合题意,解法数加一。代码编写过程中利用了permutations函数枚举所有的数字排列情况,并在验证每一种排列情况时利用字典记录了字母与数字的映射关系。代码import refrom itertools import permutationsexpression='READ+WRITE+TALK==SKILL'words=re.split('\W',exp原创 2021-02-04 16:09:26 · 231 阅读 · 0 评论 -
程序员的算法趣题(python解法)-04:落单的男女
问题解题思路这道题目表述得可能不是很清晰。假设最后分完两组后,整个队伍分成前半部分和后半部分。题目问的是无论怎么分,使得前半部分中男女人数不相等,并且后半部分男女人数也不相等,这样的到场顺序有多少种。本题用动态规划(dp)完成,dp[i][j]表示当前已经来了i位女性和j位男性时符合题目要求的个数。为了使得前半部分男女人数不相等,i=j的情况不合法。为了使得后半部分男女人数不相等,10-i=20-j的情况不合法。代码dp=[[0]*21 for i in range(11)]dp[0][0原创 2021-02-03 20:22:03 · 217 阅读 · 4 评论 -
程序员的算法趣题(python解法)-03:日期的二进制转换
问题解题思路关键在于如何枚举1964年10月10日-2020年7月24日这段时间的日期范围。若完全自己实现是很麻烦的一件事情,因为在枚举年月日时(年份是1964-2020,月份是1-12,直接for循环就可以),但每个月的天数是不一样的,尤其是二月份的天数还要考虑是否为闰年。所以实现起来较为繁琐,考虑直接利用工具库来完成。方法一是利用datetime,方法二是利用pandas。代码方法一:from datetime import datetime,timedeltares=[]t=d原创 2021-02-03 14:34:46 · 546 阅读 · 0 评论 -
程序员的算法趣题(python解法)-02:还在用现金支付吗
问题解题思路用递归求解,递归结束条件是当coins中的硬币全部被考虑过(i==n),此时若target为零,则表明正好凑齐所需的总额,全局变量res加一。当i<n时,当前考虑的硬币为coins[i],可以选取t枚该硬币,并需保证target-t*coin>=0且usable-t>=0(选取t枚改硬币后剩余的target值不为负且剩余的可选硬币数不为负)。代码coins=[10,50,100,500]n=len(coins)res=0def dfs(target,i,usab原创 2021-02-02 20:03:55 · 221 阅读 · 2 评论 -
程序员的算法趣题(python解法)-01:数列的四则运算
写在前面在跨年活动中很荣幸获得力扣送的2020年度实体勋章和《程序员的算法趣题》实体书。最近正好过年期间有时间阅读此书,但由于书中所用解题语言大多为ruby和javascript,故决定在本专栏挑选其中一些经典的题目用python代码来完成。原书电子版可在https://leetcode-cn.com/leetbook/detail/interesting-algorithm-puzzles-for-programmers/上查看。问题解题思路求解空间是1000-9999,也就是所有的四位正原创 2021-02-01 17:56:44 · 275 阅读 · 0 评论