1 單選題(每題 2 分,共 30 分)
第1題 2025年4月19日在北京舉行了一場頗為矚目的人形機器人半程馬拉松賽。比賽期間,跑動著的機器人會利用 身上安裝的多個傳感器所反饋的數據來調整姿態、保持平衡等,那么這類傳感器類似于計算機的(?? )。
A. 處理器????????????????????? ? ? B. 存儲器?????????? ? ? ? ? ? ? C. 輸入設備? ? ? ? ? ? ? ? ? ?? ? ? ? D. 輸出設備
解析:答案:C。所有傳感器都用于采集數據,屬于輸入設備,故選C。
第2題 小楊購置的計算機使用一年后覺得內存不夠用了,想購置一個容量更大的內存條,這時需要的內存條是(?? )。
A. RAM??????????????????????????? ?B. ROM??????????????????? ? ? C. CACHE???????????????? ? ? ? ? ? ? ?D. EPROM
解析:答案:A。內存條屬于隨機存儲器(RAM)。ROM為只讀存儲器,數據只能讀不能寫,不能發內存條使用,錯誤。CACHE為高速緩存,一般集成在CPU中,不能當內存條使用,EPROM為可編程只讀存儲器,正常情況下只讀,相當于ROM,在特定條件下可改寫內容,如固化程序、數據等,也不能當內存條使用。故選A。
第3題 下列哪個Python表達式能正確將十六進制數?(?? )
A. int('2A', 10)???????????????????B. int('2A', 16)??????????????C. bin(0x2A)?????????????????????????D. hex(42)
解析:答案:B。int()有至少三種功能,單參數:數據為浮點數則將此浮點數轉換為整數,數據為字符串(不能含小數)則將此字符串按十進制轉換為整數。雙參數,第1參數必須為字符串,第2個參數為整數表示進制,A.將"2A"按十進制轉換為十進制,會報錯("A"為非十進制數)。B.將"2A"按十六進制轉換為十進制,正確。bin()將一整數轉換為二進制,hex()將一整數轉換為十六進制。故選B。
第4題 執行下面Python代碼后,輸出的結果是?(?? )
- fruits = ['apple', 'banana', 'cherry']
- fruits.append('orange')
- fruits.insert(1, 'grape')
- print(fruits)
A. ['apple', 'grape', 'banana', 'cherry', 'orange']
B. ['apple', 'banana', 'grape', 'cherry', 'orange']
C. ['apple', 'grape', 'banana', 'cherry']
D. ['apple', 'grape', 'orange', 'banana', 'cherry']
解析:答案:A。append()是尾部添加,'orange'添加在'cherry'后,insert()為插入,在索引1('apple'后)插入'grape'。故選A。
第5題 執行下面Python代碼后,輸出的結果是?(?? )
- numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
- result = numbers[2:7:2] + numbers[-3::-3]
- print(result)
A. [2, 4, 6, 7, 4]? ? ? ? ?B. [2, 4, 6, 6, 3, 0]????????? C. [2, 4, 6, 7, 4, 1]? ? ? ? ? ?D. [2, 4, 6, 7, 4, 1, 0]
解析:答案:C。numbers[2:7:2]從索引2開始步長為2到索引7(不含)為[2,4,6],numbers[-3::-3]從索引-3開始步長為-3到索引0(含)為[7,4,1],result為[2,4,6]+[7,4,1]= [2,4,6,7,4,1]。故選C。
第6題 關于Python元組,以下說法錯誤的是?(?? )
A. 元組是不可變的數據類型????????????????????????????????? B. 元組可以作為字典的鍵
C. 元組支持切片操作??? ?????????????????????????????????????????D. 元組中的元素可以被重新賦值
解析:答案:D。元組為不可變數據類型,元素不可更改,不可變數據類型可作字典的鍵,元組作為序列支持切片操作,所以D錯誤。故選D。
第7題 執行下面Python代碼后,輸出的結果是?(?? )
- print((1, 2, 3) < (1, 2, 4))
A. True????????????????????? ? ? ? ?B. False??????? ? ? ? ? ?? ? ? ? ?C. 報錯? ? ? ? ? ? ? ? ? ? ? ? ? ?D. None
解析:答案:A。序列比較,先比較第1個元素,第1個元素相同再比較第2個元素,以此類推,直到最后一個元素。對本題,第1個元素、第2個元素都相同,第3個元素3<4成立,所以結果為True。故選A。
第8題 關于字典的 .get() 方法,以下說法錯誤的是?(?? )
A. 當鍵不存在時,.get()方法可以返回 None
B. .get() 方法可以設置默認返回值
C. .get() 方法比直接使用 [] 訪問更安全
D. .get() 方法會修改原字典
解析:答案:D。字典的 .get() 方法是獲取鍵的值,可設置默認返回值作為鍵不存在時的返回值,如不設置默認返回值,則鍵不存在時返回None,用dict.get(key)比直接使用dict[key]訪問更安全,所以D錯誤。故選D。
第9題 以下哪個字典推導式能正確將列表 ['Python', 'Java', 'C++'] 轉換為 {'Python':6, 'Java':4, 'C++':3} (字符串作為鍵,長度作為值)?(?? )
A. {len(x): x for x in ['Python', 'Java', 'C++']}
B. {x: len(x) for x in ['Python', 'Java', 'C++']}
C. {x: x.length() for x in ['Python', 'Java', 'C++']}
D. {x: size(x) for x in ['Python', 'Java', 'C++']}
解析:答案:B。Python求字符串長度的函數為len(),字符串沒有.length()方法,也沒有size(),C.、D.錯誤,A.長度為鍵、值為列表元素,不合題意。所以B正確。故選B。
第10題 執行下面Python代碼后,輸出的結果是?(?? )
- s = " Hello, World! "
- result = s.strip().lower().replace('world', 'Python').capitalize()
- print(result)
A. Hello, python!??????????? ? B. Hello, Python!???????? ? C. hello, python!???????? ? ? ?D. hello, Python!
解析:答案:A。在 Python 中,.strip()?是一個字符串方法,用于移除字符串開頭和結尾的指定字符(默認為空白字符)。.lower()?是一個字符串方法,用于將字符串中的字母轉換為小寫。.replace()?是一個字符串方法,用于字符串中的“原子串”替換為“新子串”。.capitalize()是一個字符串方法,用于把字符串首字母改為大寫,其他字母為小寫,非字母字符不變。語句2將s字符串的首尾空格去掉,轉為小寫,將"world"替換為"Pyhon",然后首字母改大寫其他字母改小寫,所以result的值為"Hello, python!"。故選A。
第11題 執行下面Python代碼后,輸出的結果是?(?? )
s = "one,two,three"
parts = s.split(',')
new_s = '-'.join([p[:2] for p in parts])
print(new_s)
A. o-t-t???????????????????????????B. one-two-three? ? ? ? ? ? ?C. on-tw-th???????????? ? ? ? ? ?D. one,two,three
解析:答案:C。在 Python 中,.split()?是一個字符串方法,用于用指定分隔符將字符拆分為列表。字符串.join()用字符串連接列表中的字符串元素。列表推導式[p[:2] for p in parts]生成parts元素前2個字符為元素列表,綜合為用“-”連接s串中用“,”分隔子串中的前兩個字符,所以C.符合。故選C。
第12題 以下哪個操作會修改集合 s = {1, 2, 3} 的內容?(?? )
A. s.union({4, 5})????????????????????????????????????????????????????B. s.difference({1})
C. s.intersection_update({2, 3})?????????????????????????????D. s.issubset({1, 2, 3, 4})
解析:答案:C。在 Python 中,s.union()?是一個集合方法,用于“并”運算指定集合返回一個并一個“并”的新集合,但并不修改集合s。s. difference()?是一個集合方法,用于“差”運算指定集合返回一個“差”后的新集合,但并不修改集合s。s.intersection_update()是一個集合方法,用于“交”運算指定集合并更新原集合,即修改集合s。.issubset()是一個集合方法,用于判斷集合是否是指定集合的子集,并不修改集合s。所以只有C.的操作會修改集合s。故選C。
第13題 執行下面Python代碼后,輸出的結果是?(?? )
A. {1, 2, 3, 4, 5}? ? ? ? ? ? ? B. {1, 2, 4, 5}? ? ? ? ? ? ??? ?C. {3}?????????????????????? ? ? ? ? ? D. set()
- set1 = {1, 2, 3}
- set2 = {3, 4, 5}
- print(set1 ^ set2)
解析:答案:B。^是集合的差分運算符,去掉兩個集合的公共部分再合并。第1、2行兩個集合的公共元素為{3},所以運算結果中不含元素{3}。故選B。
第14題 下列哪個選項可以將字符串 "hello" 轉換為列表 ['h', 'e', 'l', 'l', 'o'] ?(?? )
A. list("hello")??????????????? ? B. "hello".split()???????????? C. "hello".to_list()?????????? ? ?D. ["hello"]
解析:答案:A。list()函數可以將字符串轉換為每個字符為元素的列,A.正確。.split()為字符串方法,可以將字符串按指定字符拆分為列,"hello".split()是按空白字符作分隔符進行拆分,"hello"中無空白字符,結果為["hello"],所以B.錯誤。Python中字符串無.to_list()方法,C.錯誤。["hello"]的結果仍是["hello"],D.錯誤。故選A。
第15題 凱撒加密是一種經典的加密方法,它通過將字母表中的每個字母按照固定的位移量進行替換來實現加密。 例如,當位移量為1時:
- a→b, b→c, ..., y→z
- z→a (循環回到字母表開頭)
- 其他字符(如大寫字母、數字、符號等)保持不變
現在需要實現一個凱撒加密程序,具體要求如下:
- 只對小寫字母進行加密
- 位移量為1
- 非小寫字母字符保持原樣不變
- 加密后的字符需要保持原始的大小寫格式
請補全下面代碼中的空白處,使其能夠正確實現上述加密功能:
text = input("請輸入要加密的字符串:")
encrypted = []
for char in text:
??? if char.islower():
??????? code = ord(char) # 獲取字符的ASCII碼
??????? new_code = (________) % 26 + ord('a') # 填空處
??????? encrypted.append(chr(new_code))
??? else:
??????? encrypted.append(char)
print("加密結果:", ''.join(encrypted))
A. code - ord('a') + 1? ? ? ? ? ?B. code + 1? ? ? ? ?C. ord(char) + 1? ? ? ? ? D. (code - ord('a')) * 2
解析:答案:A。code - ord('a')可以將小寫字母轉換為0~25,+1為偏移量,,%26將偏移后的數字仍為0~25,如25(z)+1=26%26=0(a),A.正確。B.、C.結果相同,則不可能是答案,D.的code - ord('a')可以將小寫字母轉換為0~25,*2無意義。故選A。
2 判斷題(每題 2 分,共 20 分)
第1題 現在,人們參加各種閉卷考試時通常都不允許將智能手機、平板電腦等帶入考場,因為智能手表通常都有嵌 入操作系統及通信等功能,所以也不允許攜帶入考場。(?? )
解析:答案:正確。智能手表因為具有嵌入操作系統及通信等功能,?通訊功能風險:1.智能手表普遍具備藍牙、Wi-Fi或蜂窩網絡功能,可實現實時信息收發(如接收答案、傳輸試題),即使關機或斷網,其硬件模塊仍存在作弊隱患。2.?信息存儲與計算能力?:可存儲公式、文檔、圖片等考試相關資料,或內置計算器、單位換算等工具,違反"僅依靠知識儲備答題"的原則。3.?隱蔽性高,監管困難:部分智能手表外觀與普通手表相似,監考人員難以快速甄別功能;其屏幕切換、震動提醒等特性可能用于傳遞作弊信號,所以也不允許隨身攜帶。故正確。
第2題 執行下面Python代碼后,輸出的結果是 True。(?? )
- x = 15
- y = 7
- print((x ^ y) < (x & y))
解析:答案:錯誤。x=15=(0000 1111)?,y=7=(0000 0111)?。x ^ y =(0000 1111)? ^ (0000 0111)?= (0000 1000)?=8,x & y=(0000 1111)? & (0000 0111)?= (0000 0111)?=7,所以(x ^ y) < (x & y)=8<7不成立,輸出False。故錯誤。
第3題 表達式 ~0b0011 << 2 的結果是 -0b1100 (即十進制 -12 )。(?? )
解析:答案:錯誤。~0b0011=0b11...1100,~0b0011 << 2 = 0b11...110000=-0b10000=-16。故錯誤。
第4題 若用枚舉算法解決"密碼鎖破解"問題,則十進制3位數字密碼最多需要嘗試1000次就一定能打開。(?? )
解析:答案:正確。十進制3位數字密碼,每位有10種可能,枚舉3位需要的次數為10×10×10=1000,所以最多需要嘗試1000次就一定能破解密碼。故正確。
第5題 執行下面Python代碼后,會將列表 a 的前兩個元素替換為 [10, 20] 。
- a = [1, 2, 3, 4, 5]
- a[:2] = [10, 20]
- print(a)
解析:答案:正確。a[:2]=[10,20],表示a的索引為0、1兩個元素替換10、20,a=[10,20,3,4,5],所以會將列表a的前兩個元素替換為[10, 20]。故正確。
第6題 使用 update() 方法合并字典時,如果鍵重復,新值會覆蓋舊值。
解析:答案:正確。字典的update()方法,可用字典更新另一字典,如果鍵已存在則更新,如鍵不存在則添加鍵值對。所以使用update()方法合并字典時,如果鍵重復,新值會覆蓋舊值的說法正確。故正確。
第7題 執行下列Python代碼,輸出的結果是 2。
- t = (1, 2, 3) * 2
- print(len(t))
解析:答案:錯誤。序列的乘法運算為序列元素重復多少次,t=(1, 2, 3) * 2=(1,2,3,1,2,3),所以len(t)=6,不是2。故錯誤。
第8題 Python代碼 set1 = {1, 2, 3}; set1.remove(4) 能正常執行,且 set1 保持不變。
解析:答案:錯誤。因為set1={1, 2, 3},set1.remove(4)因set1中不存在元素4而報錯,所以代碼不能正常執行。故錯誤。
第9題 在Python中,字符串是不可變對象,因此執行 s = "hello"; s[0] = "H" 會導致程序報錯。
解析:答案:正確。因為字符串s是不可變對象,s[0]="H"試圖改變s的第1個字符,而導致程序報錯。故正確。
第10題 在Python中使用 list({"a": 1, "b": 2}) 可以將字典 {"a": 1, "b": 2} 轉換為 [("a", 1), ("b", 2)] 。
解析:答案:錯誤。默認字典轉換只包括鍵,而不是鍵值對,相當于dict.keys(),要得到題目所給的結果,需用list({"a": 1, "b": 2}.items()),所以錯誤。故錯誤。
3 編程題(每題 25 分,共 50 分)
3.1 編程題1
- 試題名稱:奇偶校驗
- 時間限制:3.0 s
- 內存限制:512.0 MB
3.1.1 題目描述
數據在傳輸過程中可能出錯,因此接收方收到數據后通常會校驗傳輸的數據是否正確,奇偶校驗是經典的校驗方式 之一。
給定n個非負整數c?,c?,...,c?代表所傳輸的數據,它們的校驗碼取決于這些整數在二進制下1的數量之和的奇偶性。如果這些整數在二進制下共有奇數個1,那么校驗碼為1;否則校驗碼為0。你能求出這些整數的校驗碼嗎?
3.1.2 輸入格式
第一行,一個正整數 ,表示所傳輸的數據量。
第二行,n個非負整數c?,c?,...,c?,表示所傳輸的數據。
3.1.3 輸出格式
輸出一行,兩個整數,以一個空格分隔:
第一個整數表示c?,c?,...,c?在二進制下 的總數量;
第二個整數表示校驗碼(0或1)。
3.1.4 樣例
3.1.4.1 輸入樣例1
- 4
- 71 69 83 80
3.1.4.2 輸出樣例1
- 13 1
3.1.4.3 輸入樣例2
- 6
- 1 2 4 8 16 32
3.1.4.4 輸出樣例2
- 6 0
3.1.5 數據范圍
對于所有測試點,保證1≤n≤100,1≤c?≤255。
3.1.6 編寫程序思路
分析:本題目主要考察位運算,c & 1為1表示c為奇數,c & 1為0表示c為偶數。要統計一個數對應二進制中1的個數,方法有多種,這里給兩種。方法一:可以用c & 1獲得c對應二進制的最后一位,加c & 1即這位是1則加1,否則加0,然后將該數右移1一位,丟掉最后一位,直至該數為0結束。方法二:可以用 c =c & (c - 1)去掉c中對應二進制中最右邊的1,直至c=0結束,能運算c = c & (c - 1)的次數即為c對應二進制中1的個數。方法三:將數據轉換為二進制字符串,加切片做。
用方法一編程參考程序:
n = int(input()) #隨后將輸入的數據個數
cin = [int(i) for i in input().split()] #列表推導式將輸入數據轉換為整數并轉為列表
cnt = 0
for c in cin:while c:cnt += c & 1 #也可用cnt += c % 2c >>= 1
print(cnt, cnt % 2) #cnt % 2偶數為0,奇數為1
用方法二編程參考程序:
n = int(input()) #隨后將輸入的數據個數
cin = [int(i) for i in input().split()] #列表推導式將輸入數據轉換為整數并轉為列表
cnt = 0
for c in cin:while c:c = c & (c - 1) #將c對應的二進制最右邊的1改為0cnt += 1 #計數cnt加1
print(cnt, cnt % 2) #cnt % 2偶數為0,奇數為1
用方法三編程參考程序:
n = int(input()) #隨后將輸入的數據個數
cin = [int(i) for i in input().split()] #列表推導式將輸入數據轉換為整數并轉為列表
cnt = 0
for c in cin:ci = bin(c)[2:] #去掉'ob'cnt += ci.count('1') #計數cnt加ci中1的個數
print(cnt, cnt % 2) #cnt % 2偶數為0,奇數為1
3.2 編程題2
- 試題名稱:分糖果
- 時間限制:3.0 s
- 內存限制:512.0 MB
3.2.1 題目描述
有n位小朋友排成一隊等待老師分糖果。第i位小朋友想要至少a?顆糖果,并且分給他的糖果數量必須比分給前一位小朋友的糖果數量更多,不然他就會不開心。
老師想知道至少需要準備多少顆糖果才能讓所有小朋友都開心。你能幫幫老師嗎?
3.2.2 輸入格式
第一行,一個正整數n,表示小朋友的人數。
第二行,n個正整數a?,a?,...,a?,依次表示每位小朋友至少需要的糖果數量。
3.2.3 輸出格式
輸出一行,一個整數,表示最少需要準備的糖果數量。
3.2.4 樣例
3.2.4.1 輸入樣例1
- 4
- 1 4 3 3
3.2.4.2 輸出樣例1
- 16
3.2.4.3 輸入樣例2
- 15
- 314 15926 53589793 238462643 383279502 8 8 4 1 9 7 1 6 9 3
3.2.4.4 輸出樣例2
- 4508143253
3.2.5 數據范圍
對于所有測試點,保證1≤n≤1000,1≤a?≤10?。
3.2.6 編寫程序思路
分析:根據題意,第i人,除了至少給該人期望的糖果數,還必須比前一人多(至少多1顆),故第i人應該給的糖果數為兩者中大的那個數。算法可以用max(),也可以用列表。
方法一(用max()函數):第i人應該給的糖果數為max(cin[i-1]+1,cin[i]),cin[i-1]為前一人給的糖果數,而cin[i]則是該人期望的糖果數(輸入的數值)。對第1個人期望的糖果數(輸入的數值)。
n = int(input()) #小朋友數量。隨后將輸入的數據個數
cin = [int(i) for i in input().split()] #用列表推導式將輸入數據轉換為整數列表
for i in range(1,len(cin)):cin[i] = max(cin[i - 1] + 1, cin[i]) #比前一位小朋友多1與當前,兩者取大者
print(sum(cin)) # 輸出求和值,如果不會用sum()函數,則可用循環累加求和
方法二(用if條件):第i人應該給的糖果數cin[i]=max(cin[i-1]+1,cin[i]),即當cin[i]>cin[i-1],cin[i]便是該人期望的糖果數(輸入的數值),否則當cin[i]<=cin[i-1],cin[i-1]+1為該人期望的糖果數(輸入的數值)。對第1個人的前一人給的糖果數為0,cin[1]即為第1人期望的糖果數。完整程序如下:
n = int(input()) #小朋友數量。隨后將輸入的數據個數
cin = [int(i) for i in input().split()] #用列表推導式將輸入數據轉換為整數列表
for i in range(1,len(cin)):if cin[i] <= cin[i - 1]: #如果小于等于前一位小朋友cin[i] = cin[i - 1] + 1 #比前一位小朋友多1(必須比前一位更多)
print(sum(cin)) # 輸出求和值,如果不會用sum()函數,則可用循環累加求和