在利用AI刷题的时候,有一道题目是有一个由数字字符和 ? 组成的字符串,目标是将所有的 ? 替换成数字字符,使得替换后的字符串表示的十进制整数成为给定整数 p 的倍数。对于一个算法题目小白来说,这种题目无疑是让我无从下手的,所以我用了MarsCode来帮助我解题,MarsCode也是给出了我这个题的思路以及该选择的数据结构算法。
首先告诉我应该使用动态规划来做这个题目,定义一个DP数组 dp[i][r],其中 i 表示当前处理到字符串的第 i 位,r 表示当前字符串模 p 的余数。dp[i][r] 表示前 i 位字符串中,余数为 r 的方案数。这样我对这个题目就有了一个大致的理解和方向,知道应该从动态规划这个方向去思考接下来应该怎么做,这是我觉得AI帮助我们刷题的时候很好的一点,给你一个思路一个方向,告诉你什么样的问题应该使用什么样的算法去解决,这对我们今后的做题选择上也是很好的启发,之后做题的时候就会在刚接触题的时候对于算法的选择更得心应手一些。
接着就是初始化,Mars Code也是告诉了我应该怎样分析问题去进行初始化的值以及如何进行状态转移,初始化的话就是i为0的时候,也就是给定的字符串是空串的时候那么只有一种情况就是余数为0,所以应该定义dp[0][0]为1,这是初始化,状态转移的话就是根据一个一个字符是?还是数字分别进行处理,如果是问号,那么就尝试所有的数字(0-9)放到?的位置上进行计算,把之前的方案数加上计算出现在的方案数,如果是数字的话,直接更新余数即可,这样最终结果就到了dp[n][0]上面,直接返回dp[n][0]即可。
这道题目如果说我自己做的话肯定是做不出来的,去找类似的题目的题解,或者去看一些类似的算法题及思想,是非常浪费时间的,并且也可能找的方向不对,比如说这个题目用到的动态规划,如果我一开始没看出来这道题用什么去解的话,那会走很多弯路,浪费很多时间,而利用MarsCode就很好的解决了效率低下的问题,直接把题目复制到MarsCode这里让他给出一些思路,他就会像上述的一样一步一步引导我做题,使得我既有自己的思考,又会节约很多时间,这就是实践使用MarsCode的时候我最大的感受。
在这之后为了巩固一下这个算法,我也问了MarsCode有没有类似的题目推荐,MarsCode也是直接给我列出了很多题目供我练习,如果自己去搜索题目的话又要浪费掉一些时间,相比之下,MarsCode简直就是保姆级别的编程工具。这就是在实践使用MarsCode刷题时的一些经历和感受。