記錄下第一次參加leetcode 周賽


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道題的解法笨是笨了些,不過最終都運行通過了

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM