2020届实习招商银行信用卡笔试题(IT算法方向)python版(同2019春招笔试题)
僅供學習交流用,侵刪。 只關注編程題的同學,請點擊目錄直接跳轉。
目錄
單選題&多選題節選
編程題1
編程題2
編程題3
問答題(二選一)
單選題節選
有多選和單選,有點惡心的。。不確定答案,僅截圖記錄了。
編程題1
第一題解答:
a = [] n = int(input()) m = int(input()) for i in range(n):a.append(int(input()))kmin = max(a)for i in range(m):a[a.index(min(a))] += 1print(max(a), kmin + m)編程題2
先手寫了幾個情況,從6、7、8、9寫了4個,發現推導過程中,蘊含著一個迭代的過程,所以考慮找規律。最終歸納為一個等比數列求和的問題:
n = int(input())if n>=6:print( 2**(n-6)%666666666 ) else:print(0)然后神奇地發現case100%,通過了。。。
編程題3
此題原型為Codeforces 558C Amr and Chemistry,可網上搜索相關答案。
下面給出2種解答:
第一種case通過率80%:
#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ Created on Thu Apr 11 13:49:13 2019 第三題 試劑x2或者/2,最少幾次使得試劑量相等 @author: youxinlin """''' # input 3 4 8 2 # output 2# input 3 3 5 6 # output 5 '''read = lambda: map(int, input().split()) n = int(input()) a = list(read())m = max(a) + 1 #最大劑量+5cnt = [0] * m print('ori cnt = ',cnt)step = [0] * m print('ori step = ',step)was = [-1] * m #幾種檔位 print('ori was = ',was) print(' ')for i in range(n):x = a[i]q = [(x, 0)]st = 0while st < len(q):x, y = q[st] #數值,步數st += 1if x >= m or was[x] == i: #若翻倍后的劑量大于一開始時的【最大劑量】,或,沒有更多選擇了(即q中之后其他的備選方案中劑量已經是達到過的x了)# 不讓最終方案的劑量大于一開始最多劑量的那瓶,減少運算量。因為若選擇往上翻倍,必然存在最小公倍數,則無止境。continuewas[x] = i #was的索引表示劑量檔位,第i瓶試劑達到了這個檔位,則置該檔位為該瓶標號i;# 如果沒有瓶子達到過某個檔位 則該位一直是-1# 所以 was數組記錄著情況print('was = ',was) step[x] += y # 某瓶達到x檔位所需要的步數。( 不用st,保證是最少的步數!)print('step = ',step) cnt[x] += 1 #計數。某瓶試劑量達到x檔位后,這個檔位被達到的次數+1。print('cnt = ',cnt)q.append((x * 2, y + 1)) #q存放方案,每次操作都可以乘以2或者除以2。x表示劑量,y表示第幾次操作q.append((x // 2, y + 1))print('q =',q)print('\n')result = min(step[x] for x in range(m) if cnt[x] == n) #當 cnt[x]==n,表示x這個檔位同時有n瓶達到過,即符合所有瓶子的劑量相等的條件 # 即可以讓每瓶的劑量都 等于 x ,從而滿足要求 # step[x] 記錄著 讓每瓶劑量都等于x所需要的最小操作次數 # 再從step[x]中選出最小值 即題目所求最小值 print(result)這種方案優先選擇往下降倍的方案的原因是:假設有兩瓶試劑,一開始劑量為a,b。
往上翻倍達到二者劑量最小公倍數需要的操作次數是:
log2(b)+log2(a),if a,b互質
log2(b/a),if b能整除a,即b為最小公倍數
往下除以2達到二者劑量的最大公約數需要的操作次數是:
log2(a)+log2(b),if a,b互質
log2(b/a),if b能整除a,即a是最大公約數
故二者操作次數相等,只需考慮往下降倍的方案,使得窮舉方案時可以收斂到劑量為0,在有限步驟內完成。
第二種方案是網上別人作答方案:
#第三題python3:(更快版本) def main():input()aa = list(map(int, input().split()))le, l = max(aa).bit_length(), []for i, a in enumerate(aa):j = le - a.bit_length()aa[i] = a << jl.append(j)mi, ma = min(aa), max(aa)a = mask = (1 << le) - 1if mi == ma:while mi == mi & a:mask = aa &= a << 1else:while mi != ma:mask &= mask << 1mi >>= 1ma >>= 1while not (mi & 1):mask &= mask << 1mi >>= 1mask ^= (1 << le) - 1le = mask.bit_length() + 1res = [0] * lecache = {}for a, i in zip(aa, l):a &= maskif a:a = a.bit_length()tmp = cache.get((i, a))if tmp is None:cache[i, a] = tmp = [0] * leif a:base, baseidx = a - i, le - a - 1else:base, baseidx = 0, le - i - 1i, j = baseidx, basewhile i:i -= 1j += 1tmp[i] = ji, j = baseidx, basewhile i < le:tmp[i] = ji += 1j += 1for i, j in enumerate(tmp):res[i] += jprint(min(res))if __name__ == '__main__':main()問答題(二選一)
選答了第二題。?
正好最近看了一些稀少目標檢測的文獻:Schwartz E , Karlinsky L , Shtok J , et al. RepMet: Representative-based metric learning for classification and one-shot object detection[J]. 2018.
這篇文章里很詳實地介紹了少量樣本訓練和分類識別問題的related work,通過閱讀相關工作,可以大概了解一下現有的方法。另外,作者也基于DML提出了新的網絡模型用于解決這個問題。
用DML來處理稀少樣本問題是個不錯的途徑。推薦一本外文書:Metric Learning: A Survey。
看完大概也能講出一些東西,這樣開放題,言之有理即可吧。
?
總結
以上是生活随笔為你收集整理的2020届实习招商银行信用卡笔试题(IT算法方向)python版(同2019春招笔试题)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一文了解新一代信息技术
- 下一篇: java前端vml_在Web中使用Jav