"""
最長回文字符串問題
"""
# 說明:方法很多,這個是最簡單,也是最容易理解的一個,利用了動態規化。
# 先確定回文串的右邊界i
,然后以右邊界i
向左找回文串。
# 假設在i
之前的最長回文子串長度是max_over_str,此時需要分別檢查i+1
左側字符串長度為max_over_str+2
和max_over_str+1
子串是不是回文串。
# 如果max_over_str+2
是回文串,那么字符串的最大長度變成max_over_str+2
,對於max_over_str+1
同理。
def sloutions(str): lens = len(str) start = 0 max_over_str = 0 for i in range(lens): if i - start >= 1 and str[i - max_over_str - 1:i + 1] == str[i - max_over_str - 1:i + 1][::-1]: start = i - max_over_str - 1 max_over_str += 2 if i - start >= 0 and str[i - max_over_str:i + 1] == str[i - max_over_str:i + 1][::-1]: start = i - max_over_str max_over_str += 1 return str[start:start + max_over_str]
"""
磁盤容量大小排序
磁盤的容量單位有M、G、T,其關系為 1T = 1000G、1G = 1000M,如樣例所示先輸入磁盤的個數,
再依次輸入磁盤的容量大小,然后按照從小到大的順序對磁盤容量進行排序並輸出。
"""
# 難點說明:
# 特殊條件,小數,同類值,邊界值等需要充分考慮,否則用例調試通過率很低的。以下代碼僅供參考,實際情況也可能未考慮完整
lis = [] def sloution(): dic = {} try: num = input().strip() for i in range(int(num)): lis.append(input().strip()) except: pass for index, i in enumerate(lis): if "M" in i: dic[(index, i)] = float(i[:-1]) if "G" in i: dic[(index, i)] = (float(i[:-1])) * 1000 if "T" in i: dic[(index, i)] = (float(i[:-1])) * 1000 * 1000 tmp = sorted(dic.items(), key=lambda x: (x[1], x[0])) for i in tmp: print(i[0][1])
"""
找出一個字符串中出現次數最多的字符,並輸出該字符以及它出現的次數。true區分大小寫,false不分大小寫
"dahsjkdDSKLFSds true"
"dasdas false"
"""
# 說明:還是邊界值的考慮,思路自己可以擴展
from collections import Counter try: while True: tmp = input().strip() if ' ' in tmp: string, flag = tmp.split() if flag == "false": string = string.lower() dic = dict(Counter(string)) dic = sorted(dic.items(), key=lambda x: (x[1]), reverse=False) key = dic.pop() print(key[0], key[1]) break except: pass
"""
如果一個整數可以分解成兩個質數的和,求這樣的質數的組數,比如18可以分解成7+11、5+13,即兩組。
支持一次輸入多行,以0結束輸入,輸出以"end"字符串結束,下面是樣例
輸入:
2
5
10
18
0
輸出:
0
1
2
2
end
"""
import math def issushu(num): """ 判斷是否是素數 """ if num == 1: return False elif num == 2: return True else: for i in range(2, int(math.sqrt(num)) + 1): if num % i == 0: return False return True def sushu(num): """ 查找num范圍內的所有素數 """ lis = [] for i in range(2, num + 1): if issushu(i): lis.append(i) return lis # 按要求輸入一個數,並返回結果 while True: val = [] try: num = int(input().strip()) if num == 0: print("end") break lis = sushu(num) for i in range(len(lis)): for j in range(i + 1, len(lis)): if num == lis[i] + lis[j]: val.append((lis[i], lis[j])) print(val) print(len(val)) val.clear() except: break
"""
輸入一個字符串 和一個標志
例子: aA1bB2cC3 1
假如這個標志是 1 就把字符串中小寫字母反轉輸出 cA1bB2aC3
假如這個標志是 2 就把字符串中大寫寫字母反轉輸出 aC1bB2cA3
假如這個標志是 3 就把字符串中數字的位置反轉輸出 aA3bB2aC1
"""
# 搞出一個后面就全出來了,主要是在於替換。是換成列表,刪除,增加;還是源字符串上刪除,增加。一定要注意處理好索引的問題
try: strs,num = input().strip().split(" ") lis = list(strs) lis_index = [] key_num = [] if num == "1": for i in lis: if i.islower(): lis_index.append(lis.index(i)) key_num.append(i) key_num = key_num[::-1] strs = ''.join(lis) for i in strs: if i.islower(): strs = strs.replace(i," ",1) for i in key_num: strs = strs.replace(" ",i,1) print(strs) lis_index.clear() key_num.clear() if num == "2": pass except: pass
"""
水仙花數
“水仙花數”是指一個三位數,它的各位數字的立方和等於其本身。
現在要求輸出所有在m和n范圍內的水仙花數。
輸入
300 380
輸出
370 371
"""
input_lis = list(map(int, input().split())) if input_lis[0] < 100: input_lis[0] = 100 if input_lis[0] > 999: input_lis[0] = 999 if input_lis[1] < 100: input_lis[1] = 100 if input_lis[1] > 999: input_lis[1] = 999 if input_lis[0] > input_lis[1]: input_lis[0], input_lis[1] = input_lis[1], input_lis[0] result = [] for i in range(input_lis[0], input_lis[1] + 1): a, b, c = [k for k in str(i)] if i == int(a) ** 3 + int(b) ** 3 + int(c) ** 3: result.append(i) else: print(" ".join(str(i) for i in result))
"""
給定一個正整數數組,最大為100個成員,從第一個成員開始,
走到數組最后一個成員最少的步驟數。第一步必須從第一元素開始,1<=步長<len/2,
第二步開始以所在成員的數字走相應的步數,如果目標不可達返回-1,只輸出最少的步驟數。
輸入
7 5 9 4 2 6 8 3 5 4 3 9
輸出
2
說明
第一步:第一個可選步長選擇2,第一個成員7走第2個成員,第二步,第2個成員為9,經過9個成員到最后
"""
step_min = [] step_count = 2 def fist_step(num): for i in range(int(len(num) / 2)): # 第二步索引值 a = num[i] + i + 1 if a == len(num): step_min.append(step_count) return if len(num) > a: last_num = num[i + num[i]:] last_step(last_num) step_min.append(-1) def last_step(last_num): global step_count step_count = step_count + 1 step_long = last_num[0] if step_long == len(last_num) - 1: step_min.append(step_count) step_count = 2 return elif step_long > len(last_num) - 1: step_count = 2 pass else: last_num = last_num[step_long:] return last_step(last_num) m = [7, 5, 9, 4, 2, 6, 8, 3, 5, 4, 3, 9] b = fist_step(m) print(step_min) step_min_step = min(step_min) print(step_min_step)
"""
題目三:
先輸入一個行數
比如說是2 再輸入兩個字符串(用逗號隔開)
4,5,4
5,4,5
然后輸入操作的步驟數目
比如說是2,每一次輸入標志了上面二維數組里面的兩個數字
0,0,0,2 00代表了第1行第一列的4 02和第一行第三列的4
(如果這兩個數字能用三根短線連起來,並且相等,那么就把這兩個位置上的數字變成0)
1,0,0,1 同上(10是5 01也是5)
如果輸入的多組操作,都能正常完成數字的消除,就返回0k
如果有一組操作存在錯誤,就返回這個操作的下標。
分析錯誤的原因:操作里面指明的位置在二維數組里面沒有,下標越界,兩個下標的值不相等,或者就是不能用三個短線把這兩個數連起來
"""
----pass
"""
流水線效率優化問題
m條流水線,n個工序,每個工序用時t1,t2,...,tn,可以並行執行
求耗時最短問題
"""
---pass
"""
url字符串拼接問題
輸入一個字符串,逗號隔開
保證兩個字符能夠憑借成一個完整的url
# 題型有坑,調試死活只通過75%
輸入
/dad/,/da
輸出
/dad/da
"""
#####
注:
以上題型均為個人整理,實際考試中不一定能保證用例100%通過。題型覆蓋面廣,這只是極個別題型,歡迎留言補充。
####