iT邦幫忙

2022 iThome 鐵人賽

DAY 26
0
自我挑戰組

leetcode 30天 不中斷解題挑戰系列 第 26

Day26 leetcode隨機選題 (String、Two Pointer、GCD)

  • 分享至 

  • xImage
  •  

首先是 1328. Break a Palindrome (medium)
https://leetcode.com/problems/break-a-palindrome/

替換掉一個字母,破壞回文,而且替換完之後必須是字典最小排序。

老實說個人覺得這題滿有意思的,平常都是在想怎麼判斷是不是回文或者是組成回文,第一次寫到這種題目。

想法:
把越前面的字母替換為"a"即可

  1. 判斷是否為一個字母,一個字母必為回文
  2. 判斷是否為全"a",若是則替換最後一個為'b'
  3. 將越前面的非'a'字母替換為'a'即可

一開始的寫法,要顧及奇數個狀態下,最中間被替換沒啥用。

class Solution:
    #改一個字母讓他不是回文
    #字典排法要是最小的
    def breakPalindrome(self, palindrome: str) -> str:
        pL = len(palindrome)
        if pL == 1:#無論怎麼改一定都是回文
            return ""
        if set("a") == set(palindrome):#全部都是"a"的,只要改最後一個就好
            return "a"*(pL-1)+"b"
        if (pL%2 == 1 and set("a") == set(palindrome[:pL//2]) and set("a") == set(palindrome[pL//2+1:])):#除了中間其他都是"a",那就把最後改成"b"
            return palindrome[:-1]+"b"
        for i in range(pL):#只要不是都是"a"的回文,把最前面的非"a"字母改成"a"就結束了
            if palindrome[i]!="a":
                ans = palindrome[0:i] + "a"+ palindrome[i+1:]
                return ans

稍作修改,把判斷中間的東西放到迴圈裡

class Solution:
    #小改良一下
    def breakPalindrome(self, palindrome: str) -> str:
        pL = len(palindrome)
        if pL == 1:#無論怎麼改一定都是回文
            return ""
        if set("a") == set(palindrome):#全部都是"a"的,只要改最後一個就好
            return "a"*(pL-1)+"b"
        for i in range(pL):#只要不是都是"a"的回文,把最前面的非"a"字母改成"a"就結束了
            if palindrome[i]!="a" and i != pL//2:#跳過中間
                ans = palindrome[0:i] + "a"+ palindrome[i+1:]
                return ans
        return palindrome[:-1]+"b"#除了中間其他都是"a",那就把最後改成"b"

再來是 922. Sort Array By Parity II (easy)
https://leetcode.com/problems/sort-array-by-parity-ii/

給一個整數串列nums,要把裡面是奇數的value放到奇數index,偶數value放到偶數index。其中偶數與奇數的值佔各半。

想法:
製造兩個空值和空ansList,一個專門跑偶數index,一個專門跑奇數index。
迭代nums,偶數就放到ansList的偶數index,奇數就放到奇數index

class Solution:
    #奇數放在奇數索引值
    #偶數放在偶數索引值
    #由於題目有說偶數跟奇數數目一樣,所以不用過多考慮
    def sortArrayByParityII(self, nums: List[int]) -> List[int]:
        ans = [None]*len(nums)
        i,j = 0,1
        for k in nums:
            if k%2:
                ans[j] = k
                j+=2
            else:
                ans[i] = k
                i+=2
        return ans

再來是 914. X of a Kind in a Deck of Cards (easy)
https://leetcode.com/problems/x-of-a-kind-in-a-deck-of-cards/

給一個整數串列deck,要把裡面的value進行分裝同數字的放一組,並且每一組的內容物個數必須相同。

想法:
基本上這題就是在計算公因數,
首先求出每個數字的個數有多少個,接下來判斷有沒有共同的因數即可

class Solution:
    #所有數字都要能夠組成一對或三條以上
    #每一組數字個數要相同,也就當個數不一樣時最小公因數不可為1
    def hasGroupsSizeX(self, deck: List[int]) -> bool:
        dC = Counter(deck)
        dC_set = list(set(dC.values()))
        dC_setL = len(dC_set)
        if 1 in dC_set:
            return 0
        if dC_setL == 1:
            return 1
        temp =  min(dC_set)
        tempL = []
        for i in range(2,int(temp**(1/2))+1):
            if temp % i==0:
                tempL.append(i)
                tempL.append(temp//i)
        tempL += [temp]
        print(tempL)
        for i in tempL:
            for j in dC_set:
                if j % i:
                    break
            else:
                return 1
        return 0
    #減縮版本
    def hasGroupsSizeX(self, deck):
        def gcd(a, b):
            while b: 
                a, b = b, a % b
            return a
        dC_Values = Counter(deck).values()
        return reduce(gcd, dC_Values) > 1

以上為今天的練習,感謝大家觀看


上一篇
Day25 leetcode weekly contest 314
下一篇
Day27 leetcode 隨機選題 (Array、Two Pointer、String)
系列文
leetcode 30天 不中斷解題挑戰30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言