記錄下第一次參加leetcode 周賽

2022-01-11 10:16:13 字數 4848 閱讀 8409

10.25號上午在leetcode上參加了「猿輔導」&「力扣」舉辦的第212場周賽,也是本菜雞第一次參加leetcode周賽(希望不會是最後一場,哈哈)

一共4道題,時限是1小時30分鐘

最後只做出了前2道,後面2道題,我根本看不懂。。。

不過唯一欣慰的是,這次做題沒有參考任何東西,完全是靠自己想出來的,而且都是提交一次就通過了,不容易,值得記錄下來

描述:

leetcode 設計了一款新式鍵盤,正在測試其可用性。測試人員將會點選一系列鍵(總計 n 個),每次乙個。

給你乙個長度為 n 的字串 keyspressed ,其中 keyspressed[i] 表示測試序列中第 i 個被按下的鍵。releasetimes 是乙個公升序排列的列表,其中 releasetimes[i] 表示鬆開第 i 個鍵的時間。字串和陣列的 下標都從 0 開始 。第 0 個鍵在時間為 0 時被按下,接下來每個鍵都 恰好 在前乙個鍵鬆開時被按下。

測試人員想要找出按鍵 持續時間最長 的鍵。第 i 次按鍵的持續時間為 releasetimes[i] - releasetimes[i - 1] ,第 0 次按鍵的持續時間為 releasetimes[0] 。

注意,測試期間,同乙個鍵可以在不同時刻被多次按下,而每次的持續時間都可能不同。

請返回按鍵 持續時間最長 的鍵,如果有多個這樣的鍵,則返回 按字母順序排列最大 的那個鍵。

示例 1:

輸入:releasetimes = [9,29,49,50], keyspressed = "cbcd"

輸出:"c"

解釋:按鍵順序和持續時間如下:

按下 'c' ,持續時間 9(時間 0 按下,時間 9 鬆開)

按下 'b' ,持續時間 29 - 9 = 20(鬆開上乙個鍵的時間 9 按下,時間 29 鬆開)

按下 'c' ,持續時間 49 - 29 = 20(鬆開上乙個鍵的時間 29 按下,時間 49 鬆開)

按下 'd' ,持續時間 50 - 49 = 1(鬆開上乙個鍵的時間 49 按下,時間 50 鬆開)

按鍵持續時間最長的鍵是 'b' 和 'c'(第二次按下時),持續時間都是 20

'c' 按字母順序排列比 'b' 大,所以答案是 'c'

示例 2:

輸入:releasetimes = [12,23,36,46,62], keyspressed = "spuda"

輸出:"a"

解釋:按鍵順序和持續時間如下:

按下 's' ,持續時間 12

按下 'p' ,持續時間 23 - 12 = 11

按下 'u' ,持續時間 36 - 23 = 13

按下 'd' ,持續時間 46 - 36 = 10

按下 'a' ,持續時間 62 - 46 = 16

按鍵持續時間最長的鍵是 'a' ,持續時間 16

我的思路:

這個我想的比較直白,先把每個按鍵的時間都拿到,存到乙個列表a中;

然後從這個列表中找出最大的那個;

再定義乙個列表b,把最大值依次與a中的元素對比,找出最大值所在的位置,並把這些位置存到b中;

再定義乙個列表c,從按鍵字元中提取出時間最大值對應位置的元素,放到c中;

把c中的元素倒敘排列,返回第乙個元素即可

**如下:

class

solution(object):

defslowestkey(self, releasetimes, keyspressed):

""":type releasetimes: list[int]

:type keyspressed: str

:rty

"""tm =

for t in

range(len(releasetimes)):

if t ==0:

else

: max_time =max(tm)

inde =

for i in

range(len(tm)):

if tm[i] ==max_time:

temp =

for j in

inde:

temp.sort()

temp.reverse()

return temp[0]

描述:如果乙個數列由至少兩個元素組成,且每兩個連續元素之間的差值都相同,那麼這個序列就是 等差數列 。更正式地,數列s是等差數列,只需要滿足:對於每個有效的is[i+1] - s[i] == s[1] - s[0]都成立。

例如,下面這些都是 等差數列 :

1, 3, 5, 7, 9

7, 7, 7, 7

3, -1, -5, -9

下面的數列 不是等差數列 :

1, 1, 2, 5, 7
給你乙個由n個整數組成的陣列nums,和兩個由m個整數組成的陣列lr,後兩個陣列表示m組範圍查詢,其中第i個查詢對應範圍[l[i], r[i]]。所有陣列的下標都是 從 0 開始 的。

返回boolean元素構成的答案列表answer。如果子陣列nums[l[i]], nums[l[i]+1], ... , nums[r[i]]可以 重新排列 形成 等差數列 ,answer[i]的值就是true;否則answer[i]的值就是false

示例 1:

輸入:nums =[4,6,5,9,3,7], l =[0,0,2], r =[2,3,5]輸出:[true,false,true]解釋:

第 0 個查詢,對應子陣列 [4,6,5] 。可以重新排列為等差數列 [6,5,4] 。

第 1 個查詢,對應子陣列 [4,6,5,9] 。無法重新排列形成等差數列。

第 2 個查詢,對應子陣列[5,9,3,7] 。可以重新排列為等差數列[3,5,7,9] 。

示例 2:

輸入:nums = [-12,-9,-3,-12,-6,15,20,-25,-20,-15,-10], l = [0,1,6,4,8,7], r = [4,4,9,7,9,10]

輸出:[false,true,false,false,true,true]

我的思路:1、首先反覆讀了幾遍題目和給出的示例,終於搞懂了題目的要求

第i個查詢,這裡i大小是由陣列l或r的長度確定,如果陣列長度是3,那麼i=0,1,2;

nums的子陣列是否可重新排列為等差數列:這個子陣列的範圍是根據l[i]和r[i]確定,例如示例1中第2個查詢,對應的l[2]=2,r[2]=5,所以子陣列的範圍就是nums[2]~nums[5];

然後判斷這個子陣列經過重組後能否形成等差數列,注意⚠️:可以重新排列(有些子陣列乍一看不是等差的,但是按順序重新排列後就是等差的了);

最後根據要求,返回每個子陣列的布林值即可

2、搞懂題目要求後,想一下該如何實現

這裡我能想到的最直白的方式就是用for迴圈來遍歷nums了

因為要判斷每個子陣列是否為等差數列,所以先定義了乙個方法,這個方法的作用就是判斷乙個陣列是否為等差數列;

第乙個for迴圈,用來確定需要判斷多少個子陣列是否為等差數列;

第二個for迴圈,用來提取nums中的元素,組成數列;

最終的**如下

class

solution(object):

defcheckarithmeticsubarrays(self, nums, l, r):

""":type nums: list[int]

:type l: list[int]

:type r: list[int]

:rtype: list[bool]

"""v =

for i in

range(len(l)):

temp =

for t in range(l[i], r[i]+1):

return

v

defnew(self, n):

x =n.sort()

for j in range(len(n)-1):

if n[j + 1] - n[j] == n[1] -n[0]:

else

:

if false in

x:

return

false

else

:

return true

雖然2道題的解法笨是笨了些,不過最終都執行通過了

結束後,看了看其他人的答案,感嘆人家是咋想的,寫得又快有精緻

第一次參加code reivew

從上家公司換工作到網際網路公司後,昨天第一次參加了code reivew。我之前的理解,以為code reivew和 提交時的pull request一樣,主要看對方的 實現,以發現 中的問題。其實不是,昨天參加完code review後,才對code reivew的過程有了大致的了解。code r...

記錄一下第一次寫部落格

目的 從畢業到現在2年多,好像沒有什麼自己的底蘊,不止一次懷疑自己是不是真的適合程式設計師這條路又找不到適合自己的,但回頭望望仔細一想,好像也會那麼一點點。身邊的程式設計師們好像都有自己的部落格,他們善於總結,善於對新的技術歸納整理成文,而我好像卻沒有這麼樣能力,所以有這個部落格的目的就是把自己平常...

2016第一次參加noi

2016年11月19日是我第一次參加noi比賽,我的內心十分緊張並且激動。我是今年暑假剛學習程式設計,這次競賽我的老師說能做出第一道就已經很不錯了,並且告訴我們這次去參加這個競賽主要是要積累經驗,於是我的內心沒有先前那麼緊張了。考試前一周,我認認真真的複習並背記了關於程式設計的一些內容,這也使我有了...