リートコードウィーク276
最初の質問
この質問のアイデアは、ループをジャンプして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
です。
質問2
この質問は実際には思考の質問であり、dpやdfsなどの高度なソリューションは必要ありません。質問から、目標値が得られるまで数を増やすには2つの方法があります。
-
インクリメントすると、現在の整数値が1ずつインクリメントされます(つまり、
x = x + 1
)。 -
Doubleは、現在の整数の値を2倍にします(つまり、
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
質問3
この質問は、この質問がdpで解決されたことを知っている人のように感じましたが、智力有问题
書き出すことができませんでした。少し緊張していたので、1時間以上ここで立ち往生しています。毎週の大会に初めて参加しました。書かれていません。
解決策にはフォワードdpとリバースdpがあることがわかります。実際、2つのアイデアは同じですが、リバースの方が少し便利ですが、それでもフォワードハハハを使用しています。
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)]
要約する
今週の大会をまとめると、筆力ダンク以来、初めての大会に参加しましたが、正直、まだ少し緊張しています。3番目の質問では、dpソリューションであることがわかりますが、dpはあまり熟練していないため、そこで停止するのは残念ですが、進行が遅いので、将来的には間違いなく勝つと思います。4番目の質問を読んでいませんでしたが、これが足りないところです。将来的にはエアコンが出てくることを願っています。また、みんながずっとエアコンを使って勇気を持って前進できることを願っています!!