第一题
将字符串拆分为若干长度为 k 的组
本题思路就是跳跃循环来输出每段同长度为k的值,如果最后长度可能会小于k则需要添加fill,则添加fill的个数是k - 剩余字符的长度。最后输出即可。
代码可能优化不是很高,但是也希望能给大家带来帮助!
class Solution: def divideString(self, s: str, k: int, fill: str) -> List[str]: res = [] for i in range(k,len(s)+k,k): res.append(s[i-k:i]) for i in res: if len(i) != k: res[-1] = i+fill*(k - len(i)) return res
时间复杂度为On。
第二题
得到目标值的最少行动次数
本题其实就是一个思维题,不需要用什么dp,dfs什么之类的高级解法。由题可得有两种方法来进行增加数,直到获取目标值。
递增,将当前整数的值加 1(即, x = x + 1)。
加倍,使当前整数的值翻倍(即,x = 2 * x)。
因为目标值题目已经给了,需要我们判断需要几步才能达到目标值。本题我们不需要用固定的思维—从1开始加或乘,我们可以反过来,用题目给的目标值来进行减法和除法。直到目标值为1的时候记录一共有多少步。
代码块:
class Solution: def minMoves(self, target: int, maxDoubles: int) -> int: res = 0 while target != 1: if maxDoubles != 0 and target %2 ==0: target = target /2 maxDoubles -= 1 res += 1 elif maxDoubles == 0: res += int(target - 1) target = 1 else: target -= 1 res += 1 return res
第三题
解决智力问题
本题在这次周赛的时候让我觉得我自己就是智力有问题我知道本题是用dp来解决,但是我就是写不出来,一直卡在这卡了一个小时多,因为第一次参加周赛有点紧张就没写出来。
我看题解有正向dp和逆向dp,其实两种思路是一样的,只不过逆向稍微方便一些,但是我还是用的正向哈哈哈。
class Solution: def mostPoints(self, questions: List[List[int]]) -> int: dp = [0 for i in range(len(questions) + 1)] for i in range(len(questions)): p,b = questions[i] dp[i+1] = max (dp[i+1],dp[i]) j = min(len(questions),i + b + 1) dp[j] = max(dp[i] + p , dp[j]) return dp[len(questions)]