2022 年
作者 21级cy 及 群内各成员集思广益贡献的代码;修改 20-软工-高歌
def func1(n): a = n // 50 # 能买8杯的次数 n %= 50 b = n // 30 # 能买4杯的次数 n %= 30 c = n // 10 # 能买1杯的次数 return 8 * a + 4 * b + cdef func2(n, m): result = 0 for i in range(n, m + 1): if 100 <= i <= 999 and i % 2 == 1: result += 1 return resultdef func2(n, m): if m <= 100: return 0 n = 100 if n < 100 else n if n % 2 == 0 else n - 1 m = m + 1 if m % 2 == 1 else m return (m - n) // 2def func2(n, m): return sum(1 for i in range(n, m + 1) if 100 <= i <= 999 and i % 2 == 1)def func3(s): if len(s) < 4: return -1 s = sorted(list(s)) t = s[-1] // s[0] # 公比q ** len(s) == t q = 1 while q ** len(s) < t: q += 1 for i in range(len(s) - 1): if s[i] * q != s[i + 1]: # 如果s[i + 1]不是s[i]的q倍,则缺失值为s[i] * q return s[i] * qdef func4(s): result = 0 for i in range(1, len(s), 2): # 小写字母ASCII码比大写字母大,分别计算差值,取最大值,并更新最大值 result = max(result, max(ord(s[i - 1]) - ord(s[i]), ord(s[i + 1]) - ord(s[i]))) return resultdef func5(lst): dct = {} for i in lst: # 统计所有数字出现次数 dct[i] = dct.get(i, 0) + 1 # 按照出现次数降序,出现次数相同按数字大小升序 return sorted(lst, key=lambda x: (-dct[x], x))def func6(matrix): n = len(matrix) # 将数值和坐标放在一起 t = [(matrix[i][j], i, j) for i in range(n) for j in range(n)] t.sort() # 按数值大小升序 l, r = 0, n ** 2 - 1 # 左右指针 while l < r: i1, j1 = t[l][1], t[l][2] # 较小数的坐标 i2, j2 = t[r][1], t[r][2] # 较大数的坐标 # 交换较小数和较大数 matrix[i1][j1], matrix[i2][j2] = matrix[i2][j2], matrix[i1][j1] l += 1 # 两个指针向中间靠拢 r -= 1 return matrixdef func7(n): i = 1 while n > 1: i += 1 t = i while t % 2 == 0: t //= 2 while t % 3 == 0: t //= 3 while t % 5 == 0: t //= 5 if t == 1: n -= 1 return idef func7(n): s = {1, 2, 3, 5} t = 1 while n > 1: t += 1 # 优化思路:冠数一定是冠数乘2、乘3或乘5 if (t % 2 == 0 and t // 2 in s or t % 3 == 0 and t // 3 in s or t % 5 == 0 and t // 5 in s): n -= 1 s.add(t) # 将冠数加入集合中 return tdef func7(n): s = {1} for i in range(n): t = min(s) s.remove(t) s.add(2 * t) s.add(3 * t) s.add(5 * t) return tdef func7(n): dp = [0] * (n + 1) dp[1] = 1 p2 = p3 = p5 = 1 for i in range(2, n + 1): num2, num3, num5 = dp[p2] * 2, dp[p3] * 3, dp[p5] * 5 dp[i] = min(num2, num3, num5) if dp[i] == num2: p2 += 1 if dp[i] == num3: p3 += 1 if dp[i] == num5: p5 += 1 return dp[n]import heapq def func7(n): factors = [2, 3, 5] seen = {1} # 用集合防止元素重复添加 heap = [1] for i in range(n - 1): curr = heapq.heappop(heap) # 弹出堆顶元素 for factor in factors: # 向堆中添加当前元素的2、3、5倍 nxt = curr * factor if nxt not in seen: seen.add(nxt) heapq.heappush(heap, nxt) return heapq.heappop(heap)def func7(n): def heap_insert(heap, i): # 堆插入,如果当前节点比父节点小就交换 while i != 0 and heap[i] < heap[(i - 1) // 2]: heap[i], heap[(i - 1) // 2] = heap[(i - 1) // 2], heap[i] i = (i - 1) // 2 def heapify(heap, i, size): # 堆调整,i是父节点下标,size是堆的规模,从根往叶交换 l = 2 * i + 1 # 左子节点 while l < size: # 还有子节点时 # 取较小的子节点的下标 m = l + 1 if l + 1 < size and heap[l + 1] < heap[l] else l # 取父子中较小的下标 m = m if heap[m] < heap[i] else i if m == i: # 父节点小就说明已经换好了 break heap[m], heap[i] = heap[i], heap[m] # 否则将小的子节点和父节点交换 i = m # 更新父节点 l = 2 * i + 1 # 更新左子节点 factors = [2, 3, 5] seen = {1} # 用集合防止元素重复添加 heap = [1] for i in range(n - 1): curr = heap[0] # 获取堆顶元素 heap[0] = heap[-1] # 将最后一个元素放到堆顶 heap.pop() # 删除最后一个元素 heapify(heap, 0, len(heap)) # 从该元素开始进行堆调整 for factor in factors: # 向堆中添加当前元素的2、3、5倍 nxt = curr * factor if nxt not in seen: seen.add(nxt) heap.append(nxt) heap_insert(heap, len(heap) - 1) return heap[0]def func8(n): lst = [7] while True: for num in lst: if num % n == 0: return num tmp = [] for num in lst: tmp.append(num * 10) tmp.append(num * 10 + 7) lst = tmpdef func8(n): num = 1 while True: result = 0 p = 1 tmp = num while tmp: result += (tmp & 1) * 7 * p tmp >>= 1 p *= 10 if result % n == 0: return result num += 1
总结
最后更新于