2021秋招提前批——京东数据分析笔试编程题

1、基因相似问题

基因由 A B C D E 组成,若男女两个人的基因序列的相似度大于50%,则不能结婚,相似度=两个子序列的最大公共长度(不考虑顺序)。
该题本质是最长公共子序列问题(LCS),详情参考:动态规划2.6)

def lengthOfLongestCommonSubsequence(arrA, arrB,M):
    if arrA == [] or arrA == []:
        return 0
    #创建2维矩阵存储公共序列长度
    dp = [[0]*(M + 1) for row in range(M + 1)]
    for i in range(1, M + 1):
        for j in range(1, M + 1):
            if arrA[i - 1] == arrB[j - 1]:
                dp[i][j] = dp[i-1][j-1] + 1
            else:
                dp[i][j] = max(dp[i-1][j], dp[i][j-1])
    res=round(dp[M][M]/M,2)
    if res<0.5:
        return (res,'Yes' '')      
    else:
        return (res,'No' '')
 
if __name__ == '__main__':
    M=int(input('序列长度:'))
    arrA = [i for i in input().split()]
    arrB = [i for i in input().split()]
    result=lengthOfLongestCommonSubsequence(arrA, arrB,M)
    print(result)

在这里插入图片描述

2、回位数问题

给定两个数,求这两个数之间有多少回位数?
回位数:一个数字去掉一位后,是素数

题意可能记错了,整理了下面的扩展题目

a,b=input().strip().split()
a=int(a)
b=int(b)
def sushu(x):
    sum1=0
    for i in range(2,int(x/2)+1):
        d=x/i 
        if d != int(d):
            sum1=sum1+1
    if sum1==(int(x/2)-1):
        return 1
    else:
        return 0
count=0
for i in range(a,b):
    v=str(i)
    ll=len(v)
    vv=[]
    for j in range(ll):       
        if j==(ll-1):
            vv.append(int((v[0]+v[j])))
        else:
            vv.append(int(v[j:j+ll-1]))
    vv=set(vv) 
    for j in vv:
        count=count+sushu(j)
print(count)    

在这里插入图片描述
在这里插入图片描述

3.拓展题目

参考链接:拓展题目详情

3.1素数

求n以内的素数,注意:1不是素数。

思想:对2-n-1区间进行合理优化,假设x*y=n(x<=y),那么当x和y相等时,x有最大值。即x=y=sqrt(n),所以x的区间就可以限制为2~sqrt(n)+1。
break语句用于停止整个循环,continue语句用于停止当次循环转而进入下一次循环。

# 求解10以内的所有素数,正确版本
import math
num = 2
count = 0
list_s = []
max_d = 10
while num < max_d:
    length = int(math.sqrt(num)+1) # 对遍历范围进行合理优化
    """原来for也可以接else!!!!!!!!!!!!!!!!!!!!!!!!!
    break跳出循环,执行while下一个num
	"""
    for i in range(2,length): # 注意从2开始
        if num % i == 0:
            break 
    # 这里的else跟for对齐,而不是跟if,表示只有for顺利执行时,else才执行,表示找不到因子后才认定是素数
    else: 
        count += 1
        list_s.append(num) # 存入列表
    num += 1
if count == 0:
    print(max_d,'以内没有素数')
else:
    print(max_d,'以内的素数有',count,'个,分别是:',list_s)

在这里插入图片描述

3.2 判断回文数

回文数即从左到右和从右到左一样,如:12321。

n,m=list(map(int,input().split()))
[x for x in range(n,m) if x == int(str(x)[::-1])]

在这里插入图片描述

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值