2022美团实习生笔试记录

class Solution():
    '''
    ————————————第一题——————————————
    输入:有重复值的nums
    求:数组中某个num邻居数量的最大值   (k的邻居数为k-1,k,k+1)
    以[6,2,2,1,5,3,3]为例, 2的邻居数为5,分别是1,2,2,3,3
    '''
    def meituan1(self,nums):
        dict_a={}
        res=0
        for num in nums:
            if num not in dict_a:
                dict_a[num]=1
            else:
                dict_a[num]+=1
            if num+1 not in dict_a:
                dict_a[num+1]=1
            else:
                dict_a[num+1]+=1
            if num-1 not in dict_a:
                dict_a[num-1]=1
            else:
                dict_a[num-1]+=1

        return max(list(dict_a.values()))

    '''
    ————————————第二题——————————————
    输入 m*n的grid,x表示路障,o表示无路障,可以向右下两个方向前进
        [['x','o','x','x'],
         ['o','o','x','o'],
         ['x','x','o','o'],
         ['x','x','x','x']]
    求从00到mn上所有路径中路障最少的路径的路障数量
    '''
    def meituan2(self,nums):
        m,n=len(nums),len(nums[0])
        dp=[[0 for _ in range(n)] for _ in range(m)]
        dp[0][0] =0 if nums[0][0]=='o' else 1
        for i in range(1,m):
            dp[i][0] = dp[i-1][0]+(0 if nums[i][0]=='o' else 1)
        for j in range(1,n):
            dp[0][j] = dp[0][j-1]+(0 if nums[0][j]=='o' else 1)
        for i in range(1,m):
            for j in range(1,n):
                dp[i][j]=min(dp[i-1][j],dp[i][j-1])+(0 if nums[i][j]=='o' else 1)
        # for i in range(m):
        #     print(dp[i])
        return dp[m-1][n-1]

    '''
    ————————————第三题——————————————
    最大连续相同字符:
    输入第一行 n k
    输入第二行 ++---++--++++++
    有一个仅包含’+’和’-’两种字符的字符串s,长度为n,每次操作可以把一个字符做一次转换(把一个’-’设置为’+’,或者把一个’+’置成’-’);
    但是操作的次数有上限k,问在有限的操作数范围内,能够得到最大连续的相同字符的子串的长度是多少。
    '''
    def meituan3(self,str,k):
        n=len(str)
        def get_max_len(str,aim): #将aim字符进行转换
            record=[]
            for i in range(n):
                if str[i]==aim:
                    record.append(i)
            record.append(n)
            max_l=0
            if k>len(record):return n #在k的范围内能够实现完全转换
            else:
                max_l=record[k]  #在k范围内能够转换的长度
            for i in range(k+1,len(record)):
                max_l=max(max_l,record[i]-record[i-k-1]-1)#已知的k个替换后的最大总长度 和  现在新的连续每个替换后的总长度 中最长的
            return max_l

        return max(get_max_len(str, '+'), get_max_len(str, '-'))

    '''
    ————————————第四题——————————————
    第一行输入为:品牌数量 操所数量      2 6    (俩个品牌,六个操作)
    第二行输入为:各品牌单价            1 2     (品牌一单价:1,品牌二单价:2)
    后面各行为输入操作,如:
            Add 1 2            为:品牌1 的销量是2
            Query BestSales    为:求到目前为止销量最高的品牌
            Query BestProfit   为:求到目前为止利润最高的品牌
    '''
    def meituan4(self):
        kind=2
        price=[1,2]
        price_count=[0]*kind
        sales_count=[0]*kind
        op=["Add 1 3","Add 2 2","Query BestSales","Query BestProfit","Add 2 2","Query BestProfit"]
        k=len(op)
        i=0
        while k: #有操作就执行
            a=op[i].split()
            operate=a[0]
            if operate=="Add":
                kind_a=int(a[1])-1
                num=int(a[2])
                price_count[kind_a]+=(num*price[kind_a])
                sales_count[kind_a]+=(num)
            elif operate=="Query":
                operate_a=a[1]
                if operate_a=="BestProfit":
                    max_kind=max(price_count)
                    print(price_count.index(max_kind)+1)
                if operate_a=="BestSales":
                    max_kind=max(sales_count)
                    print(sales_count.index(max_kind)+1)
            k-=1
            i+=1


if  __name__=="__main__":

    s=Solution()

    print("___________第一题___________")
    nums1=[6,2,2,1,5,3,3]
    res1=s.meituan1(nums1)
    print(res1)

    print("___________第二题___________")
    nums2=[['x','o','x','x'],
          ['o','o','x','o'],
          ['x','x','o','o'],
          ['x','x','x','x']]
    res2=s.meituan2(nums2)
    print(res2)

    print("___________第三题___________")
    str="++---++--++++++"
    res3=s.meituan3(str,2)
    print(res3)

    print("___________第四题___________")
    s.meituan4()

其中第三题参考:最大连续相同的字符

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小屋*

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值