2020届校园招聘360笔试题

本文参考博客:https://blog.csdn.net/likewind1993/article/details/100176127

1、寻找子串
在这里插入图片描述
思路:重复的最多的子字符串,那肯定是单个字符重复的最多就行了

###转化为求单个字符出现次数最多
ss = input()
ls = [s for s in ss]
p = set(ls)
max = 0
for c in p:
    if ls.count(c) > max:
        max = ls.count(c)
print(max)

2、散步
在这里插入图片描述
思路一:
1、设置两个长度为N+1的dp1、dp2数组,dp1表示出发点数组,dp2表示终点数组。dp2[i]表示某次停下是否能到第i个位置,dp2[i] = 0表示不能到达,dp2[i] = 1表示能到达,

2、初始dp1[1…n] = 1,表示可以从任意的位置出发,

对于每走dj距离,方向可以向左走或向右走,那么走完dj距离后,可到达的位置用dp2表示,即,转移方程为:

            if dp1[j]==1 and j + d[i] <= N:
                dp2[j + d[i]] = 1
            if dp1[j]==1 and j - d[i] >= 1:
                dp2[j - d[i]] = 1

3、更新下一次的出发点数组
dp1 = dp2

对于每走一步di,都要对dp[j]进行一次遍历,总共N x M次, 所以时间复杂度O(N×M),空间复杂度O(N)。

def count_destination(N,M,d):
    dp1 = [1] * (N + 1)  ###表示出发点,初始化为1所有点均可以当做出发点
    dp2 = [0] * (N + 1)  ###表示终点

    for i in range(len(d)):
        ###初始化终点数组
        for k in range(1, N + 1):
            dp2[k] = 0
        ###更新终点数组
        for j in range(1,N+1):
            #dp2[j]=0
            if dp1[j]==1 and j + d[i] <= N:
                dp2[j + d[i]] = 1
            if dp1[j]==1 and j - d[i] >= 1:
                dp2[j - d[i]] = 1

        ###更新下一次的出发点数组,此时若dp1=dp2,将会导致dp1是dp2的深拷贝,dp2值的改变会导致dp1值的改变
        for k in range(0,N+1):
            dp1[k]=dp2[k]

    ans=0
    for k in range(1,N+1):
        if dp2[k]==1:
            ans+=1
    return ans

N,M=map(int,input().split())
d=[]
for i in range(M):
    d.append(int(input()))
print(count_destination(N,M,d))

思路二:
深度优先遍历:每次从起始点开始向左或向右走,每种走法一直遍历搜索到最后一步时,再返回开始从另一种起始点出发,依次递归…

def count_destination(M,N,d_id,cur,ans):
    if cur>N or cur<1:
        return None
    if d_id==M:
        ans.append(cur)
        return None
    count_destination(M, N, d_id+1, cur + d[d_id], ans)
    count_destination(M, N, d_id+1, cur - d[d_id], ans)

N,M=map(int,input().split())
d=[]
for i in range(M):
    d.append(int(input()))
ans=[]
for i in range(1,N+1):
    count_destination(M, N, 0, i, ans)
print(len(set(ans)))
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值