搜狗算法岗笔试题2020

问题一
在一场考试中有n道选择题,每道题目的答案都是A、B、C、D中的一个,现在汪仔知道自己做出的答案和朋友做出的答案,并且他还知道朋友总共做对了多少道题。现在他想知道自己最少做对了多少道题,最多做对了多少道题。

输入:4个参数
N,选择题总数
K,朋友作对的题数
STR1,长度为n只包含ABCD的字符串,其中第i个代表汪仔第i道题做出的选。
STR2,长度为n只包含ABCD的字符串,其中第i个代表朋友第i道题做出的选。

输出:
返回一个Interval对象,start代表汪仔最少做对了多少道题,end代表汪仔最多做对了多少道题。

示例:

输入
3,3,“ABC”, “ABC”

输出
[3,3]

说明
因为汪仔和朋友的答案一样,而朋友答案全部正确,所以汪仔的答案也全部正确。

输入
3,1,“ABC”, “DDD”

输出
[0,2]

说明
如果答案为BCD,那么汪仔一道题没做对,如果答案为ABD,那么汪仔做对了两道题,因为答案中有一个D,因此汪仔不可能做对三道题。

题解:

#逻辑推理题
from interval import Interval
class Solution:
    def solve(self, n, k, str1, str2):
        # write code here
        # return Interval(3,3)
        count = 0
        for i in range(n):
            if str1[i] == str2[i]:
                count += 1
        if count <= k:
            start = count - (n-k)
            end = count + (n-k)
        else:
            start = count
            end = k + (n-count)

        return Interval(start, end)
a = Interval()
a.start = 0
a.end = 5
return a

but这么直接返回不对!逻辑对了,但返回值不对。题目里说Interval已内置,直接调用就好,实际上Interval要自己先定义再调用,艹!

问题二
甲乙两人在一个球堆中轮流取球,一次可以取走1~3个,甲先取。在每次取球后,裁判会等可能地从球堆中再取0-1个,刚好取完球的人获胜。如果再某人取完球之后,裁判从球堆中取球并将球数减少为0,那么也是该人的胜利。甲乙都是理性人,每个回合都会选择自己胜率最大的取法。设初始状态有N个球,求甲的胜利。

函数输入
输入:N 整数
输出:甲的胜率,浮点数[0,1],误差在万分之一内。但如果甲必输或必赢,则应严格地输出0或者1。

示例

输入
1

输出
1.00000

说明
当只有1个球时,甲会直接取走这个球,胜率为1

输入
4

输出
0.5

说明
当有4个球时,甲的最佳方案是取走3个球,剩一个球给裁判碰运气,胜率为0.5。甲的其他选择都是送分给乙。

题解:

class Solution:
    def calcProb(self, n):
        # write code here
        dp = [0] * (n + 1)
        if n < 4:  return 1
        dp[0] = 0
        dp[1] = 1
        dp[2] = 1
        dp[3] = 1

        for i in range(4, n + 1):
            dp[i] = max((1 - (dp[i - 1] * 0.5 + dp[i- 2] * 0.5)),	
                        (1 - (dp[i - 2] * 0.5 + dp[i - 3] * 0.5)),	
                        (1 - (dp[i - 3] * 0.5 + dp[i - 4] * 0.5)))	
                        #甲取123个球的情况
            #print('第',i,dp[i])
        return dp[n]

a = Solution()
#a.calcProb(4)
c= a.calcProb(20)
print(c)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值