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))] += 1

print(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 #最大剂量+5

cnt = [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 = 0
    while st < len(q):
        x, y = q[st] #数值,步数
        st += 1
        
        if x >= m or was[x] == i: 
            #若翻倍后的剂量大于一开始时的【最大剂量】,或,没有更多选择了(即q中之后其他的备选方案中剂量已经是达到过的x了)
            # 不让最终方案的剂量大于一开始最多剂量的那瓶,减少运算量。因为若选择往上翻倍,必然存在最小公倍数,则无止境。
            continue
        was[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 << j
        l.append(j)
    mi, ma = min(aa), max(aa)
    a = mask = (1 << le) - 1
    if mi == ma:
        while mi == mi & a:
            mask = a
            a &= a << 1
    else:
        while mi != ma:
            mask &= mask << 1
            mi >>= 1
            ma >>= 1
        while not (mi & 1):
            mask &= mask << 1
            mi >>= 1
    mask ^= (1 << le) - 1
    le = mask.bit_length() + 1
    res = [0] * le
    cache = {}
    for a, i in zip(aa, l):
        a &= mask
        if a:
            a = a.bit_length()
        tmp = cache.get((i, a))
        if tmp is None:
            cache[i, a] = tmp = [0] * le
            if a:
                base, baseidx = a - i, le - a - 1
            else:
                base, baseidx = 0, le - i - 1
            i, j = baseidx, base
            while i:
                i -= 1
                j += 1
                tmp[i] = j
            i, j = baseidx, base
            while i < le:
                tmp[i] = j
                i += 1
                j += 1
        for i, j in enumerate(tmp):
            res[i] += j
    print(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

看完大概也能讲出一些东西,这样开放题,言之有理即可吧。

发布了150 篇原创文章 · 获赞 334 · 访问量 74万+

猜你喜欢

转载自blog.csdn.net/lyxleft/article/details/89162068