這就開博乙個月了耶
然而然而,這個月裡只打了兩次周賽,都是五分鐘打完兩道題然後無了。
?唉。。。我好菜啊。。。
重新格式化**號碼
給你乙個字串形式的**號碼 number 。number 由數字、空格 』 '、和破折號 『-』 組成。字串處理,寫的很醜,大概思路就是把』0123456789』作為valid列表,只有valid的字元才能夠通過,同時用乙個counter計數,滿3次加個』-』,如果最後結束的時候尾部是』-』,就刪去,如果只多乙個,就調整』-'的位置。請你按下述方式重新格式化**號碼。
首先,刪除 所有的空格和破折號。 其次,將陣列從左到右 每 3 個一組 分塊,直到 剩下 4 個或更少數字。剩下的數字將按下述規定再分塊:
2 個數字:單個含 2 個數字的塊。 3 個數字:單個含 3 個數字的塊。 4 個數字:兩個分別含 2 個數字的塊。
最後用破折號將這些塊連線起來。注意,重新格式化過程中 不應該 生成僅含 1 個數字的塊,並且 最多 生成兩個含 2 個數字的塊。
返回格式化後的**號碼。
class
solution
:def
reformatnumber
(self, number:
str)
->
str:
num =
list
(number)
valid =
list
('0123456789'
) res =
c =0for i in num:
if i in valid:
c +=
1if c ==3:
'-')
c =0print
(res,c)
if c ==1:
res.pop(-2
) res.insert(-2
,'-'
)if c ==0:
res.pop(
) ans =
''for i in res:
ans += i
return ans
刪除子陣列的最大得分
給你乙個正整數陣列 nums ,請你從中刪除乙個含有 若干不同元素 的子陣列。刪除子陣列的 得分 就是子陣列各元素之 和 。一開始人傻了,這題目寫的有點tricky,其實關鍵點在於不同元素。所以就是要求最大無重複元素子數列。返回 只刪除乙個 子陣列可獲得的 最大得分 。
如果陣列 b 是陣列 a 的乙個連續子串行,即如果它等於 a[l],a[l+1],…,a[r] ,那麼它就是 a 的乙個子陣列。
思路是用乙個滑動視窗,右邊新滑進來的值,如果原來沒有出現,那麼白賺了乙個值,無事發生。如果新加入的值是已經存在的,那麼左邊的邊界就應該劃在上一次該值出現的右邊。這樣遍歷一遍整個陣列,存下每個視窗的和的最大值。
class
solution
:def
maximumuniquesubarray
(self, nums: list[
int])-
>
int:
n =len(nums)
presum =[0
]*(n+1
)for i in
range(1
,n+1):
presum[i]
= presum[i-1]
+nums[i-1]
# print(presum)
ptr_l =
0 ptr_r =
0 ptr_sum = presum[0]
while ptr_r < n:
# print(ptr_l,ptr_r,ptr_sum)
if ptr_r < n and nums[ptr_r]
in nums[ptr_l:ptr_r]
: ptr_l +=
(nums[ptr_l:ptr_r]
.index(nums[ptr_r])+
1)ptr_sum =
max(ptr_sum,presum[ptr_r+1]
-presum[ptr_l]
) ptr_r +=
1return ptr_sum
跳躍遊戲 vi
給你乙個下標從 0 開始的整數陣列 nums 和乙個整數 k 。這是一道因為吃飯沒做出來的題(也許不吃飯也做不出來。一開始你在下標 0 處。每一步,你最多可以往前跳 k 步,但你不能跳出陣列的邊界。也就是說,你可以從下標 i 跳到 [i + 1,
min(n - 1, i + k)] 包含 兩個端點的任意位置。
你的目標是到達陣列最後乙個位置(下標為 n - 1 ),你的 得分 為經過的所有數字之和。
請你返回你能得到的 最大得分 。
看完題解還是有點會了的!
用dp來做。
f (i
)f(i)
f(i)
表示從0
00跳到i
ii的最大得分。
那麼在i
ii後邊的j
jj的狀態轉移方程就可以寫成f(j
)=
max
min≤i
≤jf(
i)+n
ums[
j]
f(j) = \max\limits_\leq i\leq j} f(i) +nums[j]
f(j)
=min≤i
≤jmaxf(
i)+n
ums[
j]但是這個暴力dp會超時,所以我們每次不去遍歷j
jj前的k
kk個了,直接把這些結果用乙個堆存起來,每次pop得分最多的那個,同時檢查是否valid(是不是在距離k
kk內).
class
solution
:def
maxresult
(self, nums: list[
int]
, k:
int)
->
int:
n =len(nums)
dp =[0
]* n
dp[0]
= nums[0]
heap =
(-nums[0]
,0))
for i in
range(1
,n):
if heap:
while i - heap[0]
[1]> k:
val =
-heap[0]
[0] dp[i]
= nums[i]
+ val
(-dp[i]
,i))
# print(heap,i,k)
return dp[-1
]
力扣(leetcode)第 34 場雙周賽題解
解題思路 直接暴力,當變長是偶數是不用減最中間的數,當邊長是奇數時要減去最中間的數。比賽的時候沒想那麼多,看不大就用了各陣列標記有沒有加過。class solution return 0 public int findlengthofshortestsubarray vector arr else ...
力扣第165場周賽
a 和 b 在乙個 3 x 3 的網格上玩井字棋。井字棋遊戲的規則如下 玩家輪流將棋子放在空方格 上。第乙個玩家 a 總是用 x 作為棋子,而第二個玩家 b 總是用 o 作為棋子。x 和 o 只能放在空方格中,而不能放在已經被占用的方格上。只要有 3 個相同的 非空 棋子排成一條直線 行 列 對角線...
力扣第 202 場周賽
傳送門 5185 存在連續三個奇數的陣列 給你乙個整數陣列 arr,請你判斷陣列中是否存在連續三個元素都是奇數的情況 如果存在,請返回 true 否則,返回 false 示例 1 輸入 arr 2,6,4,1 輸出 false 解釋 不存在連續三個元素都是奇數的情況。示例 2 輸入 arr 1,2,...