选择题 共15道

01 02 03 04 05 06 07 08 09 10 11 12 13 14 15


判断题 共10道

16 17 18 19 20 21 22 23 24 25


编程题 共2道

26 27

829 202509GESP Python五级试卷-考试
选择题 共15道
01

以下哪种情况使用链表比数组更合适?

2分
登录后查看选项
02

下面的python代码实现给定单链表头结点 head 和一个整数 val ,删除链表中所有结点值等于 val 的节点,并返回新的头结点,则横线处填写( )。

class ListNode:
	def __init__(self, val=0, next=None):
		self.val = val
		self.next = next

def removeElements(head: ListNode, val: int) -> ListNode:
	dummy = ListNode(0, head)
	cur = dummy
	while cur.next:
		if cur.next.val == val:
			__________________________
			del del_node
		else:
			cur = cur.next
	return dummy.next
2分
登录后查看选项
03

下列python代码用Floyd判断一个单链表中是否存在环,链表的头节点为 head ,即用两个指针在链表上前进: slow 每次走 1 步, fast 每次走 2 步,若存在环, fast 终会追上 slow (相遇);若无环, fast 会先到达 nullptr。横线上应填写( )。

class ListNode:
	def __init__(self, x):
		self.val = x
		self.next = None
def hasCycle(head: ListNode) -> bool:
	if not head or not head.next:
		return False
	slow = head
	fast = head.next
	while fast and fast.next:
		if slow == fast:
			return True
		_________________
return False
2分
登录后查看选项
04

下列代码用于判断一个数是否为完全数(即等于它的真因子之和的数,如6=1+2+3),哪个选项是正确的实现?

def isPerfectNumber(n: int) -> bool:
	if n <= 1:
		return False
	sum = 1
	i = 2
	while i * i <= n:
		if n % i == 0:
			sum += i
			_______________
				sum += n // i
		i += 1
	return sum == n
2分
登录后查看选项
05

以下代码计算两个数的最大公约数(GCD),横线上应填写( )。

def gcd(a: int, b: int) -> int:
	if a < b:
		a, b = b, a # 交换a和b的值
	while b != 0:
		temp = a % b
		a = b
		b = temp
	return _________
2分
登录后查看选项
06

下面的代码实现埃拉托斯特尼筛法(埃氏筛),横线处应填入( )。

def sieve(n: int):
	is_prime = [True] * (n + 1)
	is_prime[0] = is_prime[1] = False
	for i in range(2, n + 1):
		if is_prime[i]:
			for j in range(______, n + 1, i):
				is_prime[j] = False
	return is_prime
2分
登录后查看选项
07

下面的代码实现线性筛法(欧拉筛),横线处应填入( )。

def linearSieve(n: int):
	is_prime = [True] * (n + 1)
	primes = []
	for i in range(2, n + 1):
		if is_prime[i]:
			primes.append(i)
		for p in primes:
			if p * i > n:
				break
			is_prime[p * i] = False
			if _____________:
				break
return primes
2分
登录后查看选项
08

线性筛算法中有语句 if p * i > n: break ,其目的是( )。

2分
登录后查看选项
09

唯一分解定理描述的是( )。

2分
登录后查看选项
10

给定一个 n x n 的矩阵 matrix ,矩阵的每一行和每一列都按升序排列。下面代码返回矩阵中第 k 小的元素,则两处横线上应分别填写( )。

def countLE(matrix, x):
	n = len(matrix)
	i, j = n - 1, 0
	cnt = 0
	while i >= 0 and j < n:
		if matrix[i][j] <= x:
			cnt += i + 1
			j += 1
		else:
			i -= 1
	return cnt

def kthSmallest(matrix, k):
	n = len(matrix)
	lo = matrix[0][0]
	hi = matrix[n-1][n-1]
	while lo < hi:
		mid = lo + (hi - lo) // 2
		if countLE(matrix, mid) >= k:
			________
		else:
			________
	return lo
2分
登录后查看选项
11

下述python代码实现了快速排序算法,下面说法错误的是( )。

def partition(arr, low, high):
	i, j = low, high
	while i < j:
		while i < j and arr[j] >= arr[low]:
			j -= 1
		while i < j and arr[i] <= arr[low]:
			i += 1
		arr[i], arr[j] = arr[j], arr[i]
	arr[i], arr[low] = arr[low], arr[i]
	return i

def quickSort(arr, low, high):
	if low < high:
		pivot = partition(arr, low, high)
		quickSort(arr, low, pivot - 1)
		quickSort(arr, pivot + 1, high)
2分
登录后查看选项
12

下述python代码实现了归并排序算法,则横线上应填写( )。

def merge(nums, left, mid, right):
	tmp = []
	i, j = left, mid + 1
	while i <= mid and j <= right:
		if nums[i] <= nums[j]:
			tmp.append(nums[i])
			i += 1
		else:
			tmp.append(nums[j])
			j += 1
	while i <= mid:
		tmp.append(nums[i])
		i += 1
	while ___________:
		tmp.append(nums[j])
		j += 1
	for k in range(len(tmp)):
		nums[left + k] = tmp[k]

def mergeSort(nums, left, right):
	if left >= right:
		return
	mid = (left + right) // 2
	mergeSort(nums, left, mid)
	mergeSort(nums, mid + 1, right)
	merge(nums, left, mid, right)

# 使用示例
if __name__ == "__main__":
	nums = [3, 1, 4, 1, 5, 9, 2, 6]
	mergeSort(nums, 0, len(nums) - 1)
	print(nums) # 输出排序后的数组
2分
登录后查看选项
13

假设你是一家电影院的排片经理,只有一个放映厅。你有一个电影列表 movies ,其中 movies[i] =[start_i, end_i] 表示第 i 部电影的开始和结束时间。请你找出最多能安排多少部不重叠的电影,则横线上应分别填写的代码为( )。

def maxMovies(movies):
	if not movies:
		return 0
	# 按照结束时间排序
	movies.sort(key=lambda x: x[1])
	count = 1
	_____________ = movies[0][1]
	for i in range(1, len(movies)):
		if movies[i][0] >= lastEnd:
			count += 1
			lastEnd = movies[i][1]
	return count
2分
登录后查看选项
14

给定一个整数数组 nums ,下面代码找到一个具有最大和的连续子数组,并返回其最大和。则下面说法错误的是( )。

import math
def crossSum(nums, left, mid, right):
	leftSum = -math.inf
	sum_val = 0
	for i in range(mid, left - 1, -1):
		sum_val += nums[i]
		leftSum = max(leftSum, sum_val)
	rightSum = -math.inf
	sum_val = 0
	for i in range(mid + 1, right + 1):
		sum_val += nums[i]
		rightSum = max(rightSum, sum_val)
	return leftSum + rightSum

def helper(nums, left, right):
	if left == right:
		return nums[left]
	mid = left + (right - left) // 2
	leftMax = helper(nums, left, mid)
	rightMax = helper(nums, mid + 1, right)
	crossMax = crossSum(nums, left, mid, right)
	return max(leftMax, rightMax, crossMax)

def maxSubArray(nums):
	return helper(nums, 0, len(nums) - 1)
2分
登录后查看选项
15

给定一个由非负整数组成的数组 digits ,表示一个非负整数的各位数字(最高位在数组首位)。下面代码对该整数执行 +1 操作,并返回结果数组,则横线上应填写( )。

def plusOne(digits):
	for i in range(len(digits)-1, -1, -1):
		if digits[i] < 9:
			digits[i] += 1
			return digits
		digits[i] = 0
	_______________
2分
登录后查看选项
判断题 共10道
16

基于下面定义的函数,通过判断 isDivisibleBy9(n) == isDigitSumDivisibleBy9(n) 代码可验算如果一个数能被9整除,则它的各位数字之和能被9整除。

def isDivisibleBy9(n):
	return n % 9 == 0
def isDigitSumDivisibleBy9(n):
	num_str = str(n)
	digit_sum = 0
	for c in num_str:
		digit_sum += int(c)
	return digit_sum % 9 == 0
2分
登录后查看选项
17

假设函数 gcd() 函数能正确求两个正整数的最大公约数,则下面的 findMusicalPattern(4,6) 函数返回2。

import math
def findMusicalPattern(rhythm1, rhythm2):
	commonDivisor = math.gcd(rhythm1, rhythm2)
	patternLength = (rhythm1 * rhythm2) // commonDivisor
2分
登录后查看选项
18

下面递归实现的斐波那契数列的时间复杂度为 O(2n)。

def fib_memo(n, memo):
	if n <= 1:
		return n
	if memo[n] != -1:
		return memo[n]
	memo[n] = fib_memo(n - 1, memo) + fib_memo(n - 2, memo)
	return memo[n]
if __name__ == "__main__":
	n = 40
	memo = [-1] * 100
	result = fib_memo(n, memo)
	print(result)
2分
登录后查看选项
19

链表通过更改指针实现高效的节点插入与删除,但节点访问效率低、占用内存较多,且对缓存利用不友好。

2分
登录后查看选项
20

二分查找依赖数据的有序性,通过循环逐步缩减一半搜索区间来进行查找,且仅适用于数组或基于数组实现的数据结构。

2分
登录后查看选项
21

线性筛关键是“每个合数只会被最小质因子筛到一次”,因此为 O(n)。

2分
登录后查看选项
22

快速排序和归并排序都是稳定的排序算法。

2分
登录后查看选项
23

下面代码采用分治算法求解汉诺塔问题,时间复杂度为 O(n log n)。

def move(src, tar):
	pan = src.pop()
	tar.append(pan)
def dfs(n, src, buf, tar):
	if n == 1:
		move(src, tar)
		return
	dfs(n - 1, src, tar, buf)
	move(src, tar)
	dfs(n - 1, buf, src, tar)
def solveHanota(A, B, C):
	n = len(A)
	dfs(n, A, B, C)
2分
登录后查看选项
24

所有递归算法都可以转换为迭代算法。

2分
登录后查看选项
25

贪心算法总能得到全局最优解。

2分
登录后查看选项
编程题 共2道
26

试题名称:数字选取

时间限制:1.0 s

内存限制:512.0 MB


题目描述

给定正整数 n,现在有 1,2,……,n共计n个整数。你需要从这n个整数中选取一些整数,使得所选取的整数中任意两个不同的整数均互质(也就是说,这两个整数的最大公因数为 1)。请你最大化所选取整数的数量。

例如,当n=9时,可以选择 1,5,7,8,9 共计5个整数。可以验证不存在数量更多的选取整数的方案。


输入格式

一行,一个正整数 n,表示给定的正整数。

输出格式

一行,一个正整数,表示所选取整数的最大数量。


样例

输入样例 1

6

输出样例1

4

输入样例 2

9

输出样例2

5


数据范围

对于 40% 的测试点,保证 1≤n≤1000。

对于所有测试点,保证1≤n≤105

25分
登录后作答
27

试题名称:有趣的数字和

时间限制:1.0 s

内存限制:512.0 MB


题目描述

如果一个正整数的二进制表示包含奇数个 1,那么小A就会认为这个正整数是有趣的。

例如,7的二进制表示为(111)2,包含1的个数为3个,所以7是有趣的。但是9=(1001)2包含2个1,所以9不是有趣的。

给定正整数 l,r,请你统计满足l≤n≤r的有趣的整数n之和。


输入格式

一行,两个正整数 l,r ,表示给定的正整数。

输出格式

一行,一个正整数,表示 l,r 之间有趣的整数之和。


样例

输入样例 1

3 8

输出样例1

19

输入样例 2

65 36248

输出样例2

328505490


数据范围

对于 40% 的测试点,保证 1≤l≤r≤ 104

对于另外 30%的测试点,保证l=1并且r=2k-1,其中k是大于1的正整数。

对于所有测试点,保证1≤l≤r≤109

25分
登录后作答