1. 程式人生 > 其它 >好久不見 太忙了沒寫記錄 但是題目還是一直在做的哦 55-60

好久不見 太忙了沒寫記錄 但是題目還是一直在做的哦 55-60

55跳躍遊戲

採用了第一次學的的那個方法

維持一個max: 這一步能到達的最遠距離
nextmax 下一步能到達的最遠距離
當nextmax到n-1時 直接返回
當index到max時 檢查下一步

class Solution:
    def canJump(self, nums: List[int]) -> bool:
        max = 0
        nextmax = nums[0]
        n = len(nums)
        for index,each in enumerate(nums):
            temp = index+each         #這個下標的最遠距離
            
if nextmax >= n-1: #能到最後就返回 return True if temp > nextmax: #下一步能更遠了 更新NEXTMAX nextmax = temp if index == max: 到這一步終點了 算算賬 if nextmax == index : 不能走了 返回false
return False else: 還能走 走上下一步. max = nextmax 作者:yizhu-jia 連結:https://leetcode-cn.com/problems/jump-game/solution/gen-shang-ci-de-tiao-yue-you-xi-chai-bu-odu3i/ 來源:力扣(LeetCode) 著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。

482金鑰格式化

簡單題 我直接暴力解法

先算有幾個-號 除去- 的長度對k取餘 就是第一個-前的長度

先把第一個寫了

遍歷 不是-號的加入結果 num計數 num = k個後就加一個- 號 num歸0
最後返回時不能要最後一個-號

class Solution:
    def licenseKeyFormatting(self, s: str, k: int) -> str:
        ns = len(s)
        n_ = 0
        for each in s :
            if each == '-':
                n_ +=1
        rel = ""
        len0 = (ns - n_)%k
        index = 0
        if len0 != 0:
            while index < ns :
                if s[index] != '-':
                    rel += s[index].upper()
                index += 1
                if len(rel) == len0:
                    rel += '-'
                    break

        num  = 0
        for i in range(index,ns):
            if s[i] != '-':
                rel+= s[i].upper()
                num += 1
            if num == k:
                rel += '-'
                num = 0
        return rel[:-1]

作者:yizhu-jia
連結:https://leetcode-cn.com/problems/license-key-formatting/solution/bao-li-jie-fa-ge-by-yizhu-jia-00ah/
來源:力扣(LeetCode)
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。

56 .合併區間

先排序 然後和結果裡的前一個比 考慮和前一個合併就好


超越93的時間和97的空間 排序就是神!!

rel[-1][1] = max(interval[1],rel[-1][1]) 這一步寫錯了好多次

class Solution:
    def merge(self, intervals: List[List[int]]) -> List[List[int]]:
        intervals = sorted(intervals)
        rel = [intervals[0]]
        for interval in intervals:
            if interval[0] <= rel[-1][1]:
                rel[-1][1] = max(interval[1],rel[-1][1])
            else:
                rel.append(interval)
        return rel


作者:yizhu-jia
連結:https://leetcode-cn.com/problems/merge-intervals/solution/chao-yue-93de-shi-jian-he-97de-kong-jian-wfko/
來源:力扣(LeetCode)
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。

414第三大的數

就是維持三個指標 本來想寫成堆那樣的
被多數人擊敗

class Solution:
    def thirdMax(self, nums: List[int]) -> int:
        first = -2**31-1
        second = -2**31-2
        third = -2**31-3
        for each in nums[0:]:
            if each > third:
                if each < second:
                    third = each
                elif each == second:
                    continue
                elif each < first:
                    third = second
                    second = each
                elif each > first:
                    third = second
                    second = first
                    first = each
        if third == second or third < -2**31:
            return first
        else:
            return third


作者:yizhu-jia
連結:https://leetcode-cn.com/problems/third-maximum-number/solution/bei-duo-shu-ren-ji-bai-by-yizhu-jia-fn8r/
來源:力扣(LeetCode)
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。

57 插入區間

我好像是用空間換了時間? 擊敗了百分之99.9的人

這個程式碼著實有點難看懂 我自己都不是很懂。。。 我儘量寫註釋

class Solution:
    def insert(self, intervals: List[List[int]], newInterval: List[int]) -> List[List[int]]:
        if intervals == []:
            return [newInterval]
        n = len(intervals)
        left = n       #left表示新區間要放置的下標 如果前面沒找到就是n了
        right = n     #right表示最右合併到哪個區間

        for index,each in enumerate(intervals):
            temp = newInterval[0]
            if temp <= each[1]:
                left = index
                break          找到要插入的那個下標
        for index,each in enumerate(intervals[left:]):
            temp = newInterval[1]
            if  temp <= each[1]:
                if temp >=each[0]:
                    right= index+left+1
                else:
                    right= index+left     #這裡比如[[1,2],[5,6]]  插入【3,4】的話right就是1 插入【3,5.5】的話就是2
                break             #要看右邊界在不在index+left的區間裡
        if left == n: 
            intervals.append(newInterval)      #如果新插入的比最右邊區間還右 就append
        elif right == 0:              #比最左邊的還左 就插入第一位裡
            intervals.insert(0,newInterval)
        else:
            temp = [min(intervals[left][0],newInterval[0]),max(intervals[right-1][1],newInterval[1])]
#這句是重點了  分為重合區間和不重合區間 如 [[1,2],[5,6]]  插入[3,4] left是1  temp的左邊是3和5比 因為如果新區間左邊小
# 無論合不合並 這個位置都是小的那個  [[1,2],[2.5,6]]  插入[3,4] left是1 temp左邊就是2.5和3  還是選擇2.5

#對於temp[1] 就是右邊 這就是為什麼上面求right 要加1 。如 [[1,2],[5,6]]  插入[3,4]    這時right 是1 是4在和2比 當然大 就保住了4
#一旦要發生合併 right 就會加1  這時比較就是和當前區間的右邊比了 [[1,2],[2.5,6]]  插入[3,4] right是2 4和6在比 


            intervals.insert(left,temp)     #插入相應位置
            del intervals[left+1:right+1]   #刪除被合併的那些區間 因為前面插入了 所以這裡都要加1.
#如果left=right 說明right沒有加1  也就說明沒有發生合併 單純插入 就不需要刪除了
        return intervals

作者:yizhu-jia
連結:https://leetcode-cn.com/problems/insert-interval/solution/wo-shi-yong-kong-jian-huan-liao-shi-jian-5053/
來源:力扣(LeetCode)
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。

58最後一個單詞的長度

簡單題
倒過來數 先數空格 再數字母數

class Solution:
    def lengthOfLastWord(self, s: str) -> int:
        nspace = 0
        rel = 0
        for each in s[::-1]:
            if each == ' ':
                nspace +=1
            else:
                break
        for each in s[-(nspace+1)::-1]:
            if each != ' ':
                rel += 1
            else:
                break
        return rel

作者:yizhu-jia
連結:https://leetcode-cn.com/problems/length-of-last-word/solution/xian-shu-kong-ge-zai-shu-zi-mu-shu-by-yi-4hal/
來源:力扣(LeetCode)
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。

434 字串中的單詞數

被大多數人擊敗我估計他們都用得split 哼!

class Solution:
    def countSegments(self, s: str) -> int:
        count = 0
        flag = 0
        for each in s:
            if each != ' ' and flag == 0:
                count += 1
                flag = 1
            elif each == ' ':
                flag = 0
        return count


作者:yizhu-jia
連結:https://leetcode-cn.com/problems/number-of-segments-in-a-string/solution/bei-da-bu-fen-ren-ji-bai-by-yizhu-jia-euwm/
來源:力扣(LeetCode)
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。

59 螺旋矩陣

跟我之前方法一樣四面牆往中間擠

class Solution:
    def generateMatrix(self, n: int) -> List[List[int]]:
        count = 1
        top = left = 0
        rel = [[0 for i in range(n)] for j in range(n)]
        right = down = n-1
        while count <= n*n:
            for i in range(left,right+1):
                rel[top][i] = count
                count += 1
            top += 1
            if count >  n*n:
                break
            for i in range(top,down+1):
                rel[i][right] = count
                count += 1
            right -=1
            if count >  n*n:
                break
            for i in range(right,left-1,-1):
                rel[down][i] = count
                count += 1
            down -=1
            if count >  n*n:
                break
            for i in range(down,top-1,-1):
                rel[i][left] = count
                count += 1
            left +=1

        return rel

作者:yizhu-jia
連結:https://leetcode-cn.com/problems/spiral-matrix-ii/solution/gen-zhi-qian-de-yi-mo-yi-yang-si-mian-qi-8udj/
來源:力扣(LeetCode)
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。

187 重複的DNA序列

直接一個雜湊的雜湊

class Solution:
    def findRepeatedDnaSequences(self, s: str) -> List[str]:
        n = len(s)
        if n <= 10:
            return []
        rel = []
        dict1= {}
        i = 0
        while i <= n-10:
            s1 = s[i:i+10]
            if s1 not in dict1:
                dict1[s1] = 1
            elif dict1[s1] == 1:
                rel.append(s1)
                dict1[s1] += 1
            i += 1
        return rel

作者:yizhu-jia
連結:https://leetcode-cn.com/problems/repeated-dna-sequences/solution/haxidehaxi-by-yizhu-jia-0lm0/
來源:力扣(LeetCode)
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。

60 排序序列

普通的遞迴普通的一天

就是看K是 n-1 階乘的X倍
是X倍就是取第X小的那個數字 (因為 以第一小的數開頭的數有(N-1)!個 所以找的就是k是以第幾個數字開頭的)
把這個數字加入結果,從待選列表中刪除它。
用K-X*(n-1)!
表示看K是剩下n-1個數字中的第幾位
遞迴到短一位的陣列中

class Solution:
    def getPermutation(self, n: int, k: int) -> str:
        def  myfactorial(n):           #定義階乘函式
            temp = 1
            for i in range(1,n+1):
                temp *= i
            return temp
        def getnk(resnum,reslen,k):
            nonlocal rel
            if reslen == 1:            #如果只剩一個數待選 加入結果返回   其實判不判斷都一樣  但是總要有一個遞迴出口嘛
                rel += str(resnum[0])
            else:
                i = 0
                resfactorial = myfactorial(reslen-1)
                while k > resfactorial :           #當k比(n-1)!大的時候 就說明不能以第一個數作為開頭 往後找
                    k -= myfactorial(reslen-1)
                    i = i+1
                rel += str(resnum[i])
                resnum.remove(resnum[i])            #把第X位加入結果  把第X個數從候選中刪除
                getnk(resnum,reslen-1,k)             #去後面找
        rel = ''
        resnum = [i for i in range(1,n+1)]
        getnk(resnum,len(resnum),k)
        return rel

作者:yizhu-jia
連結:https://leetcode-cn.com/problems/permutation-sequence/solution/pu-tong-de-di-gui-pu-tong-de-yi-tian-xia-nclb/
來源:力扣(LeetCode)
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。

謝謝大家!