# 113_02 # pA. 判斷字串是否有「駝峰」 ```python= s = [int(i) for i in list(input())] for i in range(1, len(s)-1): if max(s[0:i]) < s[i] and max(s[i+1::]) < s[i]: print(1) break else: print(0) ``` # pB. 判斷「趨勢」 ```python= s = list(input()) if s == sorted(s): print(1) elif s == sorted(s, reverse=True): print(2) else: print(3) ``` # pC. 共同的因數 ```python= num = sorted([int(i) for i in input().split(", ")]) for i in range(len(num)-1): for j in range(i+1, len(num)): if num[j]%num[i]: break else: print(1) break else: print(0) ``` # pD. 找出字串中出現最多次的字母 ```python= from collections import Counter s = list(input()) count = Counter(s) print(count.most_common(1)[0][0]) ``` # pE. 簡化重複字母 ```python= s = input() temp = 1 ans = "" for i in range(len(s)-1): if s[i] == s[i+1]: temp += 1 else: ans += f"{s[i]}{temp}" temp = 1 ans += f"{s[-1]}{temp}" print(ans) ``` # pF. 密碼規則 ```python= time = [0, 0, 0] # 小寫, 大寫, 數字 s = input() for i in range(len(s)): if time[0] == 0 and s[i].isupper(): print(0) break if s[i].islower(): time[0] = 1 if s[i].isupper(): time[1] = 1 if s[i].isdigit(): time[2] = 1 else: if sum(time) == 3: print(1) else: print(0) ``` # pG. 首尾碼相同的子字串個數 ```python= ans = 0 s = input() for i in range(len(s)): for j in range(i+3, len(s)): if s[i] == s[j] and s[i].isupper() and s[j].isupper(): ans += 1 print(ans) ``` # pH. 最長的「特定回文」子字串 [Manacher 演算法](https://www.youtube.com/watch?v=Dg0EP43jTXg) 有效的解決單或雙回文子字串算法 ```python= #Manacher 演算法 s = "$"+"#"+"#".join(list(input()))+"#"+"^" ans = 0 for i in range(1, len(s)-1): temp = 1 seen = set() while s[i-temp] == s[i+temp]: if s[i-temp] != "#": seen.add(s[i-temp]) temp += 1 if len(seen) > 2: ans = max(ans, temp-1) print(ans) ``` # pI. 神秘的「X」 `real` 是實數也就是常數,`imag` 是未知數的係數。 假設題目為 `1+2*X=9`,`eq1` 把題目 `=` 去除加負號,就會變成 `1+2*X-(9)`,接著透過 `eval` 讓未知數放右邊,常數加減放左邊,變成 `{-8+2j}` 此時 `X` 解就變成 `-(-8)/2`。 ```python= eq = input() eq1 = eq.replace("=","-(") + ")" c = eval(eq1, {'X': 1j}) print(int(-c.real/c.imag)) ``` # pJ. 「三進位」及「六進位」的整數相加 ```python= a, b = input().split(", ") c = int(a, 3)+int(b, 6) ans = "" while c//5: c, ans = c//5, ans+str(c%5) ans += str(c%5) print(ans[::-1]) ``` # pK. 矩陣相乘 ```python= r, c = map(int, input().split()) A = [] for _ in range(r): A.append([int(i) for i in input().split()]) n, m = map(int, input().split()) B = [] for _ in range(n): B. append([int(i) for i in input().split()]) C = [[0]*(m) for _ in range(r)] for i in range(r): for j in range(m): temp = 0 for k in range(n): temp += A[i][k]*B[k][j] C[i][j] = temp print("[", end="") ans = [] for i in C: ans.append("["+",".join(map(str, i))+"]") print(",".join(ans), end="") print("]") ``` # pL. 3 進位小數轉 9 進位小數 ```python= a, b = input().split(".") a = int(a, 3) ans_a = "" while a: a, ans_a = a//9, ans_a+str(a%9) if ans_a == "": ans_a = "0" ans_b = "" if len(b)%2: b += "0" for i in range(0, len(b), 2): ans_b += str(int(b[i])*3+int(b[i+1])) print(ans_a[::-1]+"."+ans_b) ``` # pM. 數獨解題 ```python= sol = [] for _ in range(9): temp = input().split(",") if "?" in temp: x, y = _, temp.index("?") sol.append(temp) flag = False for i in range(9): seen = set() for j in range(9): if sol[i][j] in seen: print(-1) flag = True break seen.add(sol[i][j]) if flag: break else: print(45-sum([int(i) for i in sol[x] if i.isdigit()])) ``` # pN. 重組數字 ```python= from itertools import permutations n = input() ans = set() for i in permutations(n, len(n)): temp = "" for j in i: temp += j ans.add(int(temp)) print(len([i for i in ans if i%11 == 0])) ``` # pO. 計算總費用 ```python= up_d = {"E":500, "A":800, "C":200, " ":0} down_d = {"E":400, "A":800, "C":100, " ":0} up, down = input().split(",") p = 0 total = 0 for i in up: p += 1 total += up_d[i] for i in down: p += 1 total += down_d[i] if p >= 20: print(int(total*0.9)) else: print(total) ``` # pP. 轉移文字 ```python= s = ["A", "B", "C", "D", "E", "F"] a = [int(i) for i in input() if i.isdigit()] for i in a: s.insert(i, s[0]) s.pop(0) print("".join(s)) ``` # pQ. 最長的共同子字串 ```python= s1 = input() s2 = input() ans = 0 for i in range(len(s1)): for j in range(i, len(s1)): if s1[i:j] in s2: ans = max(ans, j-i) print(ans) ``` # pR. 前後字母交換的字串 ```python= s = list(input()) if len(s)%2: for i in range(1, len(s), 2): s[i], s[i+1] = s[i+1], s[i] else: for i in range(0, len(s), 2): s[i], s[i+1] = s[i+1], s[i] print("".join(s)) ``` # pS. 正好是 10 的倍數 ```python= s = input().upper() d = [0]*(len(s)+1) for i in range(1, len(s)+1): d[i] = d[i-1]+ord(s[i-1])-64 ans = 0 for i in range(len(d)): for j in range(i+1, len(d)): if (d[j]-d[i])%10 == 0: ans = max(ans, j-i) print(ans) ``` # pT. 最中間的字元 ```python= s = list(input()) s.sort(key=lambda x: ord(x), reverse=True) mid = (0+len(s))//2 print(s[mid]) ``` # pW. 最長的合法小括號寫法 stack 用法 ```python= q = [-1] ans = 0 n = list(input()) for i, v in enumerate(n): if v == "(": q.append(i) else: q.pop() if not q: q.append(i) else: ans = max(ans, i-q[-1]) print(ans) ``` # pX. 出什麼牌最厲害 ```python= key = {"A": 1, "J":11, "Q":12, "K":13} n = input().replace(" ", "").split(",") for i in range(len(n)): if n[i].isdigit(): n[i] = int(n[i]) else: n[i] = key[n[i]] def sol(n): temp = set() for i in n: temp.add(i) temp = list(temp) if len(temp) >= 5: temp = sorted(temp) for i in range(len(temp)-4): if temp[i+4] - temp[i] == 4: return 1 from collections import Counter count = Counter(n) value = list(count.values()) if 3 in value and 2 in value: return 2 if value.count(2) >= 2 or 4 in value: return 3 if 2 in value: return 4 return 5 print(sol(n)) ``` # pY. 巢狀括號最大深度問題 ```python= n = list(input().replace(" ", "")) ans = -1 q = 0 for i in n: if q: if i == "}": ans = max(ans, q) q -= 1 if i == "{": q += 1 print(ans if q == 0 else -1) ``` # pZ. 數字排列組合 `permutations` 是排序組合不可重複 ```python= from itertools import permutations n = input() arr = permutations(n, len(n)) ans = set() for i in arr: ans.add(int("".join(i))) ans = list(ans) ans.sort(reverse=True) for i in ans: if str(i) != n: print(i) ``` # pAA. 迴圈數字運算 ```python= n = int(input()) ans = [n] while n != 1: if n%2: n = n*5+1 else: if n >= 4: n //= 4 else: n //= 2 ans.append(n) print("->".join(map(str, ans))) ``` # pAB. 數字分群 ```python= def sol(): n = int(input()) total = n*(n+1)//2 if total%2 != 0: return 0, n target = total//2 dp = [[]]*(target+1) dp[0] = [0] for i in range(1, n+1): for j in range(target, i-1, -1): if dp[j-i]: dp[j] = dp[j-i].copy()+[i] return dp[target], n num, n = sol() if num: print(f"YES,[{','.join(map(str, sorted(num)[1::]))}],[{','.join(map(str, sorted([i for i in range(1, n+1) if i not in num])))}]") else: print("NO") ``` # pAC. 蘋果進貨問題 ```python= a, b = map(int, input().split()) print("YES" if (a+b)%3 == 0 else "NO") ``` # pAD. 凱薩密碼 ```python= s = input() n = int(input()) ans = "" for i in s: if i.isupper(): print(i, chr((ord(i)-65+n)%26+65)) ans += chr((ord(i)-65+n)%26+65) else: print(i, chr((ord(i)-97+n)%26+97)) ans += chr((ord(i)-97+n)%26+97) print(ans) ``` # pAE. 總和之半 ```python= def sol(): num = [int(i) for i in input().split(",")] total = sum(num) if total%2 != 0: return 0 target = total//2 dp = [0]*(target+1) dp[0] = 1 for i in range(len(num)): for j in range(target, num[i]-1, -1): if dp[j-i]: dp[j] = 1 return dp[target] print(sol()) ```