10.25號上午在leetcode上參加了「猿輔導」&「力扣」舉辦的第212場周賽,也是本菜雞第一次參加leetcode周賽(希望不會是最后一場,哈哈)
一共4道題,時限是1小時30分鍾
最后只做出了前2道,后面2道題,我根本看不懂。。。
不過唯一欣慰的是,這次做題沒有參考任何東西,完全是靠自己想出來的,而且都是提交一次就通過了,不容易,值得記錄下來
題目1
描述:
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
原題鏈接:https://leetcode-cn.com/problems/slowest-key/
我的思路:
這個我想的比較直白,先把每個按鍵的時間都拿到,存到一個列表A中;
然后從這個列表中找出最大的那個;
再定義一個列表B,把最大值依次與A中的元素對比,找出最大值所在的位置,並把這些位置存到B中;
再定義一個列表C,從按鍵字符中提取出時間最大值對應位置的元素,放到C中;
把C中的元素倒敘排列,返回第一個元素即可
代碼如下:
class Solution(object): def slowestKey(self, releaseTimes, keysPressed): """ :type releaseTimes: List[int] :type keysPressed: str :rty """ tm = [] for t in range(len(releaseTimes)): if t ==0: tm.append(releaseTimes[0]) else: tm.append(releaseTimes[t]-releaseTimes[t-1]) max_time = max(tm) inde = [] for i in range(len(tm)): if tm[i] == max_time: inde.append(i) temp = [] for j in inde: temp.append(keysPressed[j]) temp.sort() temp.reverse() return temp[0]
題目2:等差子數組
描述:
如果一個數列由至少兩個元素組成,且每兩個連續元素之間的差值都相同,那么這個序列就是 等差數列 。更正式地,數列 s
是等差數列,只需要滿足:對於每個有效的 i
, s[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
個整數組成的數組 l
和 r
,后兩個數組表示 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]
原題鏈接:https://leetcode-cn.com/contest/weekly-contest-212/problems/arithmetic-subarrays/
我的思路:
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): def checkArithmeticSubarrays(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): temp.append(nums[t]) v.append(self.new(temp)) return v def new(self, n): x = [] n.sort() for j in range(len(n)-1): if n[j + 1] - n[j] == n[1] - n[0]: x.append(True) else: x.append(False) if False in x: return False else: return True
雖然2道題的解法笨是笨了些,不過最終都運行通過了
結束后,看了看其他人的答案,感嘆人家是咋想的,寫得又快有精致