首先是 1328. Break a Palindrome (medium)
https://leetcode.com/problems/break-a-palindrome/
替換掉一個字母,破壞回文,而且替換完之後必須是字典最小排序。
老實說個人覺得這題滿有意思的,平常都是在想怎麼判斷是不是回文或者是組成回文,第一次寫到這種題目。
想法:
把越前面的字母替換為"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
以上為今天的練習,感謝大家觀看