



参考答案
1 """ 2 其实这题就是0-1背包问题 3 首先来看一下经典背包问题,稍作修改就可以得出这题的解答 4 0-1背包问题 5 问题描述:有一个背包可以装物品的总重量为W,现有N个物品,每个物品中w[i],价值v[i],用背包装物品,能装的最大价值是多少? 6 定义状态转移数组dp[i][j],表示前i个物品,背包重量为j的情况下能装的最大价值。 7 例如,dp[3][4]=6,表示用前3个物品装入重量为4的背包所能获得的最大价值为6,此时并不是3个物品全部装入,而是3个物品满足装入背包的条件下的最大价值。 8 状态转移方程: 9 dp[i][j] = max(dp[i-1][j], dp[i-1][j-w[i]]+v[i]) 10 dp[i-1][j]表示当前物品不放入背包,dp[i-1][j-w[i]]+v[i]表示当前物品放入背包,即当前第i个物品要么放入背包,要么不放入背包。 11 """ 12 """ 13 dp = [[0]*(n+1) for _ in range(m+1)] 14 for i in range(1,m+1): 15 for j in range(1,n+1): 16 if j-w[i]>=0: 17 dp[i][j] = max(dp[i-1][j], dp[i-1][j-w[i]]+v[i]) 18 else: 19 dp[i][j] = dp[i-1][j] 20 return dp[m][n] 21 """ 22 """ 23 现在来看下购物车的解题思路 24 购物车本质上还是0-1背包问题,只不过多了主件和附件。假设先不看附件,那么就和0-1背包一样了。附件不能单独出现,要依赖于主件。 25 对应于背包问题,主件的个数就是物品的个数,考虑每个主件时要考虑可能出现的情况。 26 输入例子: 27 1000 5 28 800 2 0 29 400 5 1 30 300 5 1 31 400 3 0 32 500 2 0 33 在当前的例子当中物品的个数就是3。 34 考虑每个物品时要考虑每种可能出现的情况,1、主件,2、主件+附件1,3、主件+附件2,4、主件+附件1+附件2,不一定每种情况都出现, 35 只有当存在附件时才会出现对应的情况。w[i][k]表示第i个物品的第k种情况,k的取值范围0~3,分别对应以上4中情况, 36 v[i][k]表示第i个物品对应第k种情况的价值,现在就把购物车问题转化为了0-1背包问题。 37 状态转移方程可以定义为 38 dp[i][j] = max(dp[i-1][j],dp[i-1][j-w[i][k]]+v[i][k]) 39 dp[i-1][j]表示当前物品不放入背包,w[i][k]表示第i个主件对应第k中情况,即当前第i个物品的4中情况中价值最大的要么放入背包,要么不放入背包。 40 需要注意:dp[i][j] = max(物品不放入背包,主件,主件+附件1,主件+附件2,主件+附件1+附件2) 41 """ 42 """ 43 dp = [[0]*(n+1) for _ in range(m+1)] 44 for i in range(1,m+1): 45 for j in range(1,n+1): 46 max_i = dp[i-1][j] 47 for k in range(len(w[i])): 48 if j-w[i][k]>=0: 49 max_i = max(max_i, dp[i-1][j-w[i][k]]+v[i][k]) 50 dp[i][j] = max_i 51 print(dp[m][n]) 52 具体代码如下: 53 54 """ 55 56 n, m = map(int, input().split()) 57 primary, annex = {}, {} 58 for i in range(1, m + 1): 59 x, y, z = map(int, input().split()) 60 if z == 0: # 主件 61 primary[i] = [x, y] 62 else: # 附件 63 if z in annex: # 第二个附件 64 annex[z].append([x, y]) 65 else: # 第一个附件 66 annex[z] = [[x, y]] 67 m = len(primary) # 主件个数转化为物品个数 68 dp = [[0] * (n + 1) for _ in range(m + 1)] 69 w, v = [[]], [[]] 70 for key in primary: 71 w_temp, v_temp = [], [] 72 w_temp.append(primary[key][0]) # 1、主件 73 v_temp.append(primary[key][0] * primary[key][1]) 74 if key in annex: # 存在主件 75 w_temp.append(w_temp[0] + annex[key][0][0]) # 2、主件+附件1 76 v_temp.append(v_temp[0] + annex[key][0][0] * annex[key][0][1]) 77 if len(annex[key]) > 1: # 存在两主件 78 w_temp.append(w_temp[0] + annex[key][1][0]) # 3、主件+附件2 79 v_temp.append(v_temp[0] + annex[key][1][0] * annex[key][1][1]) 80 w_temp.append(w_temp[0] + annex[key][0][0] + annex[key][1][0]) # 3、主件+附件1+附件2 81 v_temp.append(v_temp[0] + annex[key][0][0] * annex[key][0][1] + annex[key][1][0] * annex[key][1][1]) 82 w.append(w_temp) 83 v.append(v_temp) 84 for i in range(1, m + 1): 85 for j in range(10, n + 1, 10): # 物品的价格是10的整数倍 86 max_i = dp[i - 1][j] 87 for k in range(len(w[i])): 88 if j - w[i][k] >= 0: 89 max_i = max(max_i, dp[i - 1][j - w[i][k]] + v[i][k]) 90 dp[i][j] = max_i 91 print(dp[m][n]) 92 93 """ 94 继续优化 95 现在的时间复杂度是O(mn),时间复杂度已经无法优化,空间复杂度O(mn),可以继续优化到O(n)。 96 回顾下状态转移方程: 97 dp[i][j] = max(dp[i-1][j], dp[i-1][j-w[i]]+v[i]) 98 dp[i]只依赖dp[i-1],状态转移方程就可以改为: 99 dp[j] = max(dp_pre[j], dp_pre[j-w[i]]+v[i]) 100 dp_pre[j]存储上一次得到的值,现在只需要2*n的空间就能得到结果。继续观察可以发现,其实只用一个一维dp数组就行,不需要额外的辅助数组。 101 让j从n到1遍历,此时每次更新的dp[j]时,max函数中dp[j]和 dp[j-w[i]]都是上次保存的值。 102 状态转移方程变为: 103 for j in [n...1]: 104 dp[j] = max(dp[j], dp[j-w[i]]+v[i]) 105 如果从1到n遍历的话dp[j-w[i]]不能保证还是上次的值,这也进一步说明为什么用一维数组时需要从n到1遍历。 106 优化后的代码如下: 107 """ 108 109 n, m = map(int, input().split()) 110 primary, annex = {}, {} 111 for i in range(1, m + 1): 112 x, y, z = map(int, input().split()) 113 if z == 0: 114 primary[i] = [x, y] 115 else: 116 if z in annex: 117 annex[z].append([x, y]) 118 else: 119 annex[z] = [[x, y]] 120 dp = [0] * (n + 1) 121 for key in primary: 122 w, v = [], [] 123 w.append(primary[key][0]) # 1、主件 124 v.append(primary[key][0] * primary[key][1]) 125 if key in annex: # 存在附件 126 w.append(w[0] + annex[key][0][0]) # 2、主件+附件1 127 v.append(v[0] + annex[key][0][0] * annex[key][0][1]) 128 if len(annex[key]) > 1: # 附件个数为2 129 w.append(w[0] + annex[key][1][0]) # 3、主件+附件2 130 v.append(v[0] + annex[key][1][0] * annex[key][1][1]) 131 w.append(w[0] + annex[key][0][0] + annex[key][1][0]) # 4、主件+附件1+附件2 132 v.append(v[0] + annex[key][0][0] * annex[key][0][1] + annex[key][1][0] * annex[key][1][1]) 133 for j in range(n, -1, -10): # 物品的价格是10的整数倍 134 for k in range(len(w)): 135 if j - w[k] >= 0: 136 dp[j] = max(dp[j], dp[j - w[k]] + v[k]) 137 print(dp[n])


1 #我的 2 import re 3 s = input() 4 ss =s.split(";") 5 print(ss) 6 L1=[] 7 x=0 8 y=0 9 powid=(x,y) 10 11 for i in ss: 12 if re.search('^[ASWD]{1}\d{1,2}$',i): 13 L1.append(i) 14 print(L1) 15 16 17 18 for j in L1: 19 if re.split('\d+',i)[0]=='A': 20 x =x-int(re.split('^A')[1]) 21 22 elif re.split('\d+',i)[0]=='S': 23 y=y-int(re.split('^S')[1]) 24 25 elif re.split('\d+',i)[0]=='D': 26 x=x+int(re.split('^D')[1]) 27 28 elif re.split('\d+',i)[0]=='W': 29 y=y+int(re.split('^W')[1]) 30 31 print(x,y) 32 33 34 #################################################################### 35 import re 36 37 coord = input().split(";") 38 coord = filter(lambda x: re.match("^[ASDW]{1}\d{1,2}$", x), coord) 39 a, b = 0, 0 40 for c in coord: 41 if c[0] == "W": 42 b += int(c[1:]) 43 elif c[0] == "S": 44 b -= int(c[1:]) 45 elif c[0] == "A": 46 a -= int(c[1:]) 47 elif c[0] == "D": 48 a += int(c[1:]) 49 50 print("{},{}".format(a, b)) 51 #################################################################### 52 input_list = input().split(';') 53 initial = [0,0] 54 55 for item in input_list: 56 if not 2 <= len(item) <= 3: 57 continue 58 59 try: 60 direction = item[0] 61 step = int(item[1:]) 62 if direction in ['A', 'D', 'W', 'S']: 63 if 0 <= step <= 99: 64 if direction == 'A': 65 initial[0] -= step 66 elif direction == 'D': 67 initial[0] += step 68 elif direction == 'S': 69 initial[1] -= step 70 elif direction == 'W': 71 initial[1] += step 72 except: 73 continue 74 75 print(str(initial[0]) + ',' + str(initial[1])) 76 77 ########################################################### 78 79 #不成熟 80 import re 81 d = input().split(";") 82 result = [0,0] 83 84 regex = re.compile(r'1[1-9]?[0-9]$') 85 l = [] 86 for s in d: 87 if regex.match(s): 88 l.append(s) 89 for item in l: 90 letter = item[0] 91 if letter == "A": 92 result[0] = result[0]-int(item[1:]) 93 elif letter == "D": 94 result[0] = result[0]+int(item[1:]) 95 elif letter == "S": 96 result[1] = result[1]-int(item[1:]) 97 else: result[1] = result[1]+int(item[1:]) 98 99 print(str(result[0]) + ',' + str(result[1]))


1 def check(s): 2 if len(s) <= 8: 3 return 0 4 a, b, c, d = 0, 0, 0, 0 5 for item in s: 6 if ord('a') <= ord(item) <= ord('z'): 7 a = 1 8 elif ord('A') <= ord(item) <= ord('Z'): 9 b = 1 10 elif ord('0') <= ord(item) <= ord('9'): 11 c = 1 12 else: 13 d = 1 14 if a + b + c + d < 3: 15 return 0 16 for i in range(len(s)-3): 17 if len(s.split(s[i:i+3])) >= 3: 18 return 0 19 return 1 20 21 while 1: 22 try: 23 print('OK' if check(input()) else 'NG') 24 except: 25 break 26 27 ######################################################### 28 #这个还是对那个重复性不一定就是3,每处理好 29 30 def check(pw): 31 if len(pw) <= 8: # 判断密码的长度 32 return False 33 34 checks = [0, 0, 0, 0] # 四种情况满足三种的辅助列表 35 for c in pw: 36 if c.isupper(): # 大写字母 37 checks[0] = 1 38 elif c.islower(): # 小写字母 39 checks[1] = 1 40 elif c.isdigit(): # 数字 41 checks[2] = 1 42 else: # 其他字符 43 checks[3] = 1 44 if sum(checks) < 3: 45 return False 46 47 for i in range(len(pw) - 2): # 循环遍历找到子字符串的起点 48 if pw[i:i + 3] in pw[i + 3:]: # 在剩下的字符串中顺序查找匹配当前字符串 49 return False 50 51 return True 52 53 54 while True: 55 try: 56 pw = input() 57 if check(pw): 58 print('OK') 59 else: 60 print('NG') 61 except: 62 break 63 ######################################################### 64 65 def CheckPasswd(passwd): 66 # 检查长度 67 if len(passwd) <= 8: 68 return "NG" 69 # 检查字符类型 70 hasNum = 0 71 hasLowercase = 0 72 hasUppercase = 0 73 hasOther = 0 74 for i in range(len(passwd)): 75 ascaii = ord(passwd[i]) 76 if ascaii >= ord('0') and ascaii <= ord('9'): 77 hasNum = 1 78 elif ascaii >= ord('a') and ascaii <= ord('z'): 79 hasLowercase = 1 80 elif ascaii >= ord('A') and ascaii <= ord('Z'): 81 hasUppercase = 1 82 else: 83 hasOther = 1 84 types = hasNum + hasLowercase + hasUppercase + hasOther 85 if types < 3: 86 return "NG" 87 88 # 检查长度大于2的重复子串 89 for i in range(len(passwd) - 3): # 检查每个长度为3的子串是否重复出现即可 90 substr = passwd[i:i + 3] 91 if len(passwd.split(substr)) > 2: 92 return "NG" 93 return "OK" # 三项条件都满足 94 95 96 while 1: 97 try: 98 passwd = input().strip() 99 print(CheckPasswd(passwd)) 100 except EOFError: 101 break 102 103 ################################################################3333 104 105 def check(sub_pswd): 106 if len(sub_pswd) <=8: 107 return False 108 flag =[0,0,0,0] 109 for i in sub_pswd: 110 if '0'<= i <='9': 111 flag[0] = 1 112 elif 'A'<= i <='Z': 113 flag[1] = 1 114 elif 'a'<= i <='z': 115 flag[2] = 1 116 else: 117 flag[3] = 1 118 if sum(flag) >=3 : 119 for i in range(len(sub_pswd)-3): 120 if sub_pswd.count(sub_pswd[i:i+3]) >=2: 121 return False 122 return True 123 else: 124 return False 125 126 while True: 127 try: 128 pswd = input() 129 print('OK' if check(pswd) else 'NG') 130 except: 131 break 132 133 ########################################################################
1 import re 2 3 def check(password): 4 if len(password) <=8: 5 return 0 6 7 a,b,c,d=0,0,0,0 8 9 for i in password: 10 if re.search('[0-9]', i): 11 a=1 12 elif re.search('[A-Z]', i): 13 b=1 14 elif re.search('[a-z]', i): 15 c=1 16 elif re.search('[^A-Za-z0-9 \f\n\r\t\v]', i): 17 d=1 18 19 if a+b+c+d<3: 20 return 0 21 22 for j in range(3, len(password)): 23 if len(password.split(password[j:j + 3])) >= 3: 24 return 0 25 return 1 26 27 while True: 28 try: 29 password = input() 30 print('Ok' if check(password) else 'NG') 31 except: 32 break 33 34 ####################################################3 35 import re 36 password = input() 37 38 if len(password) >8: 39 print('OK') 40 else: 41 print('NG') 42 43 L1=[] #数字 44 L2=[] #大写字母 45 L3=[] #小写字母 46 L4=[] #其他字符 47 48 49 for i in password: 50 if re.search('[0-9]',i): 51 L1.append(i) 52 elif re.search('[A-Z]',i): 53 L2.append(i) 54 elif re.search('[a-z]',i): 55 L3.append(i) 56 elif re.search('[^0-9a-zA-Z]', i): 57 #[^A-Za-z0-9 \f\n\r\t\v] 58 L4.append(i) 59 60 if (len(L1) and len(L2) and len(L3)) == True: 61 print('OK') 62 elif (len(L1) and len(L2) and len(L4)) == True: 63 print('OK') 64 elif (len(L1) and len(L3) and len(L4)) == True: 65 print('OK') 66 elif (len(L2) and len(L3) and len(L4)) == True: 67 print('OK') 68 elif (len(L1) and len(L2) and len(L3) and len(L4)) == True: 69 print('OK') 70 else: 71 print('NG') 72 73 74 for j in range(len(password)): 75 for k in range(3,len(password)+1): 76 if password[j:j+3]==password[k:k+3]: 77 78 print(password[j:j+3])


1 """ 2 #合唱队# 3 此题是最长递增子序列的变体,基本思路是对原序列从左到右和从右到左分别求出到每个元素的最长递增子序列的长度。 4 例如,原序列为长度为N的序列[8,20,12,15,10,9],从左至右的到序列里每个元素的最长递增子序列为l1=[1,2,2,3,2,2], 5 从右至左为l2=[1,4,3,3,2,1],l1+l2=[2,6,5,6,4,3]。 6 那么合唱队最长队伍是L = max(l1+l2)-1,减1是因为计算l1和l2时重复计算了一次元素本身。 7 因此最少出列人数为原序列长度N-L。 8 此题关键在于求出l1,l2。可由动态规划求出。用dp[i]表示从左至右到原序列第i个元素的最长递增子序列的长度, 9 从第i个元素往回遍历更新dp[i]的值。由于每个元素都需要往回遍历一次,时间复杂度是o(n^2)。 10 往回遍历如何更新dp[i]的值在其他题解已有很好的介绍,这里主要写用二分法代替往回遍历的过程,时间复杂度是o(nlogn)。 11 二分法的过程为:首先创建数组arr=[ele_1],ele_1是原序列第一个元素,然后从第二个元素开始从左至右遍历原序列 12 如果ele_i > max(arr),将ele_i加到arr最后 13 如果ele_i <= max(arr),用二分法找到arr中第一个比ele_i大(或相等)的元素并用ele_i替换 14 遍历完成后arr的长度即为最长递增子序列的长度(但arr不是最长递增子序列)。 15 第二步替换是因为为遍历到的元素可能会有比ele_i大但比替换元素小的元素,比如原序列为[2,5,8,3,4,6]。 16 17 """ 18 19 import bisect 20 def inc_max(l): 21 dp = [1]*len(l) # 初始化dp,最小递增子序列长度为1 22 arr = [l[0]] # 创建数组 23 for i in range(1,len(l)): # 从原序列第二个元素开始遍历 24 if l[i] > arr[-1]: 25 arr.append(l[i]) 26 dp[i] = len(arr) 27 else: 28 pos = bisect.bisect_left(arr, l[i]) # 用二分法找到arr中第一个比ele_i大(或相等)的元素的位置 29 arr[pos] = l[i] 30 dp[i] = pos+1 31 return dp 32 33 while True: 34 try: 35 N = int(input()) 36 s = list(map(int, input().split())) 37 left_s = inc_max(s) # 从左至右 38 right_s = inc_max(s[::-1])[::-1] # 从右至左 39 sum_s = [left_s[i]+right_s[i]-1 for i in range(len(s))] # 相加并减去重复计算 40 print(str(N-max(sum_s))) 41 except: 42 break 43 44 #######################################3 45 #参考了高赞的回答,为了加深自己的理解,手撸了一遍二分查找的代码。总的来说还是要自己敲一遍,一行行理解的快一些。 46 #二分查找,其中ls是从左到右升序 47 def find_pos(ls, num,start = 0, end = None): 48 if end == None: 49 end = len(ls) 50 while start < end: 51 index = (start+end)//2 52 if ls[index]<num: 53 start = index+1 54 else: 55 end = index 56 return start 57 58 def dplist(raw_list): 59 dp = [1]*len(raw_list) 60 stu_list = [raw_list[0]] 61 for i in range(1,len(raw_list)): 62 if raw_list[i] > stu_list[-1]: 63 stu_list.append(raw_list[i]) 64 dp[i] = len(stu_list) 65 else: 66 index = find_pos(stu_list,raw_list[i]) 67 stu_list[index] = raw_list[i] 68 dp[i] = index+1 69 return dp 70 71 while True: 72 try: 73 num =int(input()) 74 ls = list(map(int,input().split())) 75 l_ls = dplist(ls) 76 r_ls = dplist(ls[::-1])[::-1] 77 total_ls = [l_ls[i]+r_ls[i]-1 for i in range(len(ls))] 78 print(num-max(total_ls)) 79 except EOFError: 80 break
1 import sys 2 3 4 # 获取最大增长子序列 5 def get_max_up_sub_arr(count, arr): 6 up_arr = [1 for x in range(count)] 7 for i in range(count): 8 for j in range(i): 9 if arr[j] < arr[i]: 10 up_arr[i] = max(up_arr[i], up_arr[j]+1) 11 return up_arr 12 13 14 while True: 15 try: 16 count = int(input()) 17 arr = list(map(int, input().split(' '))) 18 left_up_arr = get_max_up_sub_arr(count, arr) 19 right_up_arr = get_max_up_sub_arr(count, arr[::-1])[::-1] 20 print(count - max(i + j - 1 for i, j in zip(left_up_arr, right_up_arr))) 21 except EOFError: 22 break 23 24 25 ####################################### 26 # 动态规划 27 def lengthOfLIS(lst): 28 dp = [] 29 for i in range(len(lst)): 30 dp.append(1) 31 for j in range(i): 32 if lst[i] > lst[j]: 33 dp[i] = max(dp[i], dp[j] + 1) 34 return dp # 每人左边可以站的人数 35 36 while True: 37 try: 38 n, heights = int(input()), list(map(int, input().split())) 39 # dp1:每人左边可以站的人数,dp2:每人右边可以站的人数 40 dp1, dp2 = lengthOfLIS(heights), lengthOfLIS(heights[::-1])[::-1] 41 res = [] 42 for i in range(len(dp1)): 43 res.append(dp1[i] + dp2[i] - 1) 44 print(n-max(res)) 45 except: 46 break 47 ############################################################# 48 49 import bisect #引入二分法 50 def hcteam(l): #定义一个函数,寻找最长的子序列 51 arr = [l[0]] #定义列表,将传入函数的列表第一个元素放入当前元素 52 dp = [1]*len(l) #定义一个列表,默认子序列有当前元素1,长度是传入函数的列表长度 53 for i in range(1,len(l)): #从第二个元素开始查找 54 if l[i] > arr[-1]: #如果元素大于arr列表的最后一个元素,就把它插入列表末尾 55 arr.append(l[i]) 56 dp[i] = len(arr)# 获取这个元素子序列的长度 57 else: # 否则,利用二分法找到比元素大的元素的位置,用新的元素替代比它大的那个元素的值,这样就能制造出一个顺序排列的子序列 58 pos = bisect.bisect_left(arr, l[i]) 59 arr[pos] = l[i] 60 dp[i] =pos+1 # 获取这个元素子序列的长度 61 return dp 62 63 while True: 64 try: 65 n = int(input()) 66 sg = list(map(int,input().split())) 67 left_t = hcteam(sg) #向左遍历查找子序列 68 right_t = hcteam(sg[::-1])[::-1] #向右遍历查找子序列 69 res = [left_t[i]+right_t[i]-1 for i in range(len(sg))] #因为左右都包含原元素,所以需要减1 ;得到各元素能得到的子序列的最大长度 70 print(n-max(res)) # 源列表长度-可以生成的最长子序列长度 得到需要剔除的最小人数 71 except: 72 break 73 ############################################################# 74 75 76 def find_len(b): 77 nums = b 78 if not nums: 79 return 0 80 dp = [1] * len(nums)#先初始化dp值,初始全设为1,初始只有自己 81 for i in range(1, len(nums)):#从初始的右边的人开始 82 for j in range(i):#从初始(第0个)到第j个人的左边 83 if nums[i] > nums[j] and dp[i] < dp[j] + 1: #若是第i个人的身高大于第j个人,而且自己的左边是j的话[dp[j] + 1],得到的dp值大于自己本来得到的自己左边可以有多少人的计算[dp[i]] 84 dp[i] = dp[j] + 1 #那么i就加入j的排队序列 85 return dp 86 while True: 87 try: 88 student_num = int(input()) #输入需要排队的学生数 89 student_tall = input() #输入所有的学生身高 90 student_tall = student_tall.split() 91 for i in range(student_num): 92 student_tall[i] = int(student_tall[i]) #将输入的字符转化为整数 93 len_all = [] 94 len_1 = find_len(student_tall) #获得正向(从小到大排序的dp),dp值即是每个学生的左边最多有几个人(包括自己) 95 len_2 = find_len(student_tall[::-1]) #获得逆向从小到大(从大到小)len_2[::-1]代表每个学生的右边最多有几个人(包括自己) 96 len_len_1 = len(len_1) 97 len_3 = [] 98 for i in range(len_len_1): 99 len_3.append(len_1[i] + len_2[::-1][i]) #两个相加就是每个学生的左右最多有几个人,结果包含两个自己 100 print(student_num - max(len_3) + 1)#按照输出要求,要得到踢出去几个人,所以需要len_3 -1 就是每个学生左右加上自己最多有几个人,取最大的那个学生的值,再用总数减去就是踢出去最少的人 101 except: 102 break
1 data = [1, 3, 6, 7, 9, 12, 14, 16, 17, 18, 20, 21, 22, 23, 30, 32, 33, 35] 2 3 4 def binary_search(dataset, find_num): 5 print(dataset) 6 7 if len(dataset) > 1: 8 mid = int(len(dataset) / 2) 9 if dataset[mid] == find_num: # find it 10 print("找到数字", dataset[mid]) 11 elif dataset[mid] > find_num: # 找的数在mid左面 12 print("\033[31;1m找的数在mid[%s]左面\033[0m" % dataset[mid]) 13 return binary_search(dataset[0:mid], find_num) 14 else: # 找的数在mid右面 15 print("\033[32;1m找的数在mid[%s]右面\033[0m" % dataset[mid]) 16 return binary_search(dataset[mid + 1:], find_num) 17 else: 18 if dataset[0] == find_num: # find it 19 print("找到数字啦", dataset[0]) 20 else: 21 print("没的分了,要找的数字[%s]不在列表里" % find_num) 22 23 24 binary_search(data, 66)


1 import re 2 while 1: 3 try: 4 s=input().strip() 5 #把字母取出来,然后去重,排序,得到了字母序列 6 sl=sorted(set([i.lower() for i in s if i.isalpha()])) 7 #字母序列 8 ll=[] 9 for i in sl: 10 ll+=re.findall(i,s,re.I) #从字母表SL中取i,(同时忽略大小写)与原字符串匹配,找到了,就加入到新的字符串中, 11 #字符串出现的每种字母按原序列添加到列表中 12 for j in range(len(s)): 13 if not s[j].isalpha(): 14 ll.insert(j,s[j]) #将原来的非字母,插入到新字符串的在原字符串中的位置 15 print(''.join(ll)) 16 #将非字母出现的位置设为原来的字符 17 except: 18 break 19 20 ######################################################### 21 while True: 22 try: 23 a = input() 24 zimu='' 25 for i in a: 26 if i.isalpha(): #至少有一个字符且所有字符为字母时返回True 27 zimu+=i 28 zmpx=sorted(zimu,key=str.upper)#以字母转为大写后字符串升序排序的索引排列原字符串 29 f='' 30 idx=0 31 for i in range(len(a)): 32 if a[i].isalpha(): 33 f+=zmpx[idx] 34 idx+=1 35 else: 36 f+=a[i] 37 print(f) 38 except(EOFError,KeyboardInterrupt): 39 break 40 ########################################### 41 while True: 42 try: 43 letter = input() 44 letter_list = sorted([i for i in letter if i.isalpha()],key=lambda x:x.lower()) 45 print(*(letter_list.pop(0) if v.isalpha() else v for i,v in enumerate(letter)),sep='') 46 except: 47 break 48 49 ########################################### 50 while True: 51 try: 52 s = input() 53 already, lst, dic = [], [], {} 54 # 连接相同的字母(忽略大小写),将其添加到lst中,如['Bb', 'aA'] 55 # 同时用dic记录非字母字符的位置 56 for i in range(len(s)): 57 if not s[i].isalpha(): 58 dic[i] = s[i] 59 continue 60 if s[i].lower() not in already: 61 already.append(s[i].lower()) 62 temp = s[i] 63 for j in range(i+1, len(s)): 64 if s[i].lower() == s[j].lower(): 65 temp += s[j] 66 lst.append(temp) 67 # 对lst进行冒泡排序 68 for i in range(len(lst)-1): 69 for j in range(i+1, len(lst)): 70 if lst[i].lower() > lst[j].lower(): 71 lst[i], lst[j] = lst[j], lst[i] 72 # 将非字母字符插入到原来位置 73 lst = list(''.join(lst)) 74 for i in dic.keys(): 75 lst.insert(i, dic[i]) 76 print(''.join(lst)) 77 except: 78 break 79 80 81 ####################################################### 82 83 while True: 84 try: 85 a = input() 86 a = list(a) 87 s = [] 88 s_result = [0]*len(a) 89 b = [] 90 for i in range(len(a)): 91 if(a[i].isupper()): #若是大写字母,放入s 92 s.append(a[i]) 93 elif(a[i].islower()):#小写字母也放入s 94 s.append(a[i]) 95 else: 96 b.append(i) #若是其他的符号则标记它在a中的位置 97 for i in b: 98 s_result[i] = a[i] #在新设置的列表的同一位置放置其他的符号 99 s_sort = [] 100 for i in s: 101 s_sort.append([i.lower(),i]) #每一组是【对应的小写字母,字母】 102 s_sort.sort(key=lambda ele:ele[0]) #只按照对应的小写字母排序,这样规避了大小写,且同样的字母(不区分大小写)按照输入的顺序排序 103 s_new = [] 104 for i in s_sort: 105 s_new.append(i[1]) #去掉对应的小写,保留原来的字母 106 j = 0 107 for i in range(len(s_result)): 108 if(s_result[i] == 0): #在新的列表里若是为初始设置的0,则认为这个位置应该是字母,按照排序后的字母按序插空即可 109 s_result[i] = s_new[j] 110 j = j + 1 111 print(''.join(s_result)) #按要求输出 112 except: 113 break 114 115 116 ################################################### 117 118 #先解决仅有大小写字母没有其他字符串的案例 119 #思路:设计一个包含三个元素(字符,权值,索引)的元组列表,同时对权值和索引排序 120 #如果如果是非字母,就不添加进元组,直接输出,非字母就添加进元组后再插入 121 122 while True: 123 try: 124 new_string = '' 125 string = input() 126 d = [] 127 for i in range(len(string)): 128 if string[i].isalpha(): 129 d.append((string[i],i,ord(string[i].lower()))) 130 d.sort(key=lambda x:(x[2],x[1])) 131 flag =0 132 for i in range(len(string)): 133 if string[i].isalpha(): 134 new_string +=d[flag][0] 135 flag +=1 136 else: 137 new_string += string[i] 138 print(new_string) 139 except: 140 break 141 142 ################################################## 143 """ 144 将a-z逐个标记分数0-25, 用space_lis记录非字母的位置,lis收录所有字母, 145 在收录过程中由lis的最后一个元素开始一直比较到第一个元素逐个比较这些元素和所收录字母的得分大小, 146 最后找到比想收录字母得分小或者等于的元素,在那个元素后面插入想收录字母. 147 当日想收录字母得分比lis中所有元素小的可能性也应该考虑. 这样保证了所收录字母part按照a-z顺序也让字母大小遵循原sentence. 148 最后不要忘记将space_lis中的非字母按照记录的位置加到lis中, 149 最开始本来用dictionary来记录非字母位置后来发现直接用元组逐个记录要更简单, 150 而且dictionary会打乱非字母的记录顺序,这样在还原非字母位置会很麻烦. 151 """ 152 153 l1=string.ascii_lowercase 154 l2=[x for x in range(26)] 155 l=dict(zip(l1,l2)) 156 while True: 157 try: 158 sen=input() 159 #string=string.split() 160 lis=[] 161 space_lis=[] 162 for i, part in enumerate(sen): 163 if not part.isalpha(): 164 space_lis.append((part,i)) 165 else: 166 if lis==[]: 167 lis.append(part) 168 else: 169 for j in range(1,len(lis)+1): 170 if l[part.lower()]>=l[lis[-j].lower()]: 171 if j==1: 172 lis.append(part) 173 break 174 else: 175 lis.insert(-j+1, part) 176 break 177 else: 178 if j==len(lis): 179 lis.insert(0,part) 180 break 181 for n in space_lis: 182 lis.insert(n[1], n[0]) 183 lis=''.join(lis) 184 print(lis) 185 except: 186 break 187 188 189 ############################################################### 190 while True: 191 try: 192 strs = input() 193 NewStr = "" # 先统计所有的大小写字母 194 for x in strs: 195 if x.isalpha(): 196 NewStr += x 197 NewList = sorted(NewStr, key=str.lower) # 字母按A/a-Z/z排序,并放到列表里面 198 199 NewWord = "" # 要打印的新字符串 200 idex = 0 # 用来匹配原字母列表NewList的下标 201 for i in range(len(strs)): # 遍历原字符串,把字母的按NewList进行替换,非字母的不懂 202 if strs[i].isalpha(): # 大小写字母,替换成以排序的字符串 203 NewWord += NewList[idex] 204 idex += 1 205 else: # 非字母(特殊字符、空格、数字等),还是用原字符串的字符 206 NewWord += strs[i] 207 print(NewWord) 208 except: 209 break
1 import re 2 3 s = input() 4 # A Famous Saying: Much Ado About Nothing (2012/8). 5 print(s) 6 7 ss=[] 8 for i in s: 9 if i.isalpha() == True: 10 ss+=i.upper() 11 print(ss) 12 ss=sorted(set(ss)) 13 print(ss) 14 s_new=[] 15 for i in ss: 16 s_new+=re.findall(i,s,flags=re.I) #列表的运算 17 print(s_new) 18 19 for j in range(len(s)): 20 if s[j].isalpha() == False: 21 s_new.insert(j,s[j]) 22 23 print(s_new) 24 print(''.join(s_new))


1 while True: 2 try: 3 s = input().split() 4 k = int(s[len(s) - 1]) 5 x = s[len(s) - 2] 6 ss = list(set(s[1:len(s) - 2])) 7 L_new = [] 8 9 for i in ss: 10 if len(i) == len(x) and i != x and sorted(i) == sorted(x): 11 L_new.append(i) 12 print(len(L_new)) 13 print(sorted(L_new)[k - 1]) 14 except: 15 break 16 17 ============================================== 18 19 while True: 20 try: 21 s = input().split() 22 k = int(s[len(s) - 1]) 23 x = s[len(s) - 2] 24 ss = list(set(s[1:len(s) - 2])) 25 L_new = [] 26 27 for i in ss: 28 if len(i) == len(x) and i != x and ''.join(sorted(i)) == ''.join(sorted(x)): 29 L_new.append(i) 30 print(len(L_new)) 31 print(sorted(L_new)[k - 1]) 32 except: 33 break 34 35 36 ########################################################### 37 s = input().split() 38 print(s) 39 40 # 6 cab ad abcd cba abc bca abc 1 41 # s= ['6', 'cab', 'ad', 'abcd', 'cba', 'abc', 'bca', 'abc', '1'] 42 n = s[0] 43 # print(n) 44 k = int(s[len(s) - 1]) 45 # print(k) 46 ss = list(set(s[1:len(s) - 2])) 47 print(ss) 48 49 x = s[len(s) - 2] 50 print(x) 51 52 L_new = [] 53 54 for i in ss: 55 if len(i) == len(x) and i != x and ''.join(sorted(i)) == ''.join(sorted(x)): 56 L_new.append(i) 57 58 print(len(L_new)) 59 print(sorted(L_new)) 60 print(sorted(L_new)[k - 1]) 61 62 ################################################################# 63 while True: 64 try: 65 #读取输入数据,并且转换为列表 66 data1 = input().split() 67 #获取单词的个数 68 n1 = data1[0] 69 #按字典排序的第几个兄弟词 70 n2 = data1[-1] 71 #获取输入的n个单词 72 data2 = data1[1:-2] 73 #获取兄弟词 74 data3 = data1[-2] 75 76 #用于存储兄弟词的数量 77 n3 = 0 78 #用于存储兄弟词 79 data4 = [] 80 81 for word in data2: 82 if word == data3: 83 continue 84 elif sorted(word) == sorted(data3): 85 n3 = n3 + 1 86 data4.append(word) 87 print(n3) 88 #将兄弟词按照字典排序 89 data5 = sorted(data4) 90 print(data5[int(n2)-1]) 91 except: 92 break

浙公网安备 33010602011771号