阿里巴巴笔试 算法 9.21

单选题

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

多选题

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

编程题1: 小红的01连续段

题目描述
小红定义一个01串的“连续段”为:连续相同字符的极大长度。例如:“110001111”有一个长度为2的连续段,有一个长度为3的连续段,有一个长度为4的连续段。
小红拿到了一个01串,但其中有一些字符部件了(用‘?’表示)。小红想知道,这些01串的连续段长度的最大值最多能达到多少?
输入描述

一个仅由‘0’、‘1’、‘?’组成的字符串,长度不超过200000。

输出描述

一个正整数,代表连续段长度的最大长度。

示例1
输入

1?0?1?

输出

3

代码
考试的时候太蠢了,竟然只想到了dfs爆搜

from webbrowser import get


s = input()
max_len1 = 0
max_len2 = 0

ans = 0
for ch in s:
    if ch=='0':
        max_len1 += 1
        max_len2 = 0
    elif ch=='1':
        max_len1 = 0
        max_len2 += 1
    else:
        max_len1 += 1
        max_len2 += 1
    
    ans = max(ans, max_len1, max_len2)


print(ans)
编程题2: 月考成绩

题目描述
月考结束了,每个同学都拿到了自己的成绩单。共有语文、数学、英语三门科目。
对于一个同学而言,如果存在某个同学的总分比他高,但某个单科比他低,那么这个同学就会有优越感。
请问总共有多少同学会产生优越感?
输入描述

第一行输入一个正整数n,代表同学的数量。
接下来n行,每行输入三个整数a b c,代表每个同学语文、数学、英语的分数。
1 < = n < = 1 0 5 1<=n<=10^5 1<=n<=105
0 < = a , b , c < = 100 0<=a,b,c<=100 0<=a,b,c<=100

输出描述

一个整数,代表产生优越感的同学数量。

示例1
输入

4
100 20 10
100 50 30
20 20 20
60 60 60

输出

2

说明

第三个同学会产生优越感,因为第一个同学的总分比他高,但英语的分比他低。
第一个同学会产生优越感,因为第四个同学的总分比他高,但是语文分比他低。

代码
考试的时候没想起来 O ( n l o g n ) + O ( n ) O(nlogn)+O(n) O(nlogn)+O(n)的算法,只想到了 O ( n l o g n ) + O ( n 2 ) O(nlogn)+O(n^2) O(nlogn)+O(n2)

n = int(input())

data = []
for _ in range(n):
    a, b, c = map(int, input().split())
    data.append((a+b+c, a, b, c))

data.sort(key=lambda x: (x[0], x[1], x[2], x[3]))

mina, minb, minc = float('inf'), float('inf'), float('inf')
ta, tb, tc = float('inf'), float('inf'), float('inf')
ans = 0
for i in range(n-1, -1, -1):
    total, a, b, c = data[i]
    if (a>mina and total<ta) or (b>minb and total<tb) or (c>minc and total<tc):
        ans += 1
    
    if a<mina:
        mina = a
        ta = total
    if b<minb:
        minb = b
        tb = total
    if c<minc:
        minc = c
        tc = total
print(ans)
编程题3:小红的红蓝硬币

题目描述
小红的n个硬币,其中一些硬币为红色,另外一些为蓝色。每个硬币有一个面值(保证所有硬币的面值不同)。
小红想选择一些硬币凑出总面值为p,且至少有一个红硬币和至少一个蓝硬币,你能求出选择的方案数吗?答案对 1 0 9 + 7 10^9+7 109+7取模。
提示:建议python考生使用pypy提交。
**输入描述: **

第一行输入两个正整数n和p,用空格隔开。
第二行输入一个仅包含’R’和’B’的字符串,第i个字符为’R’代表第i个硬币为红色,'B’代表蓝色。
第三行输入n个正整数a,代表每个硬币的面值。
1 < = n , a i < = 1000 1<=n,a_i<=1000 1<=n,ai<=1000
1 < = p < = 10000 1<=p<=10000 1<=p<=10000

输出描述

一个正整数,代表方案数对 1 0 9 + 7 10^9+7 109+7取模的值。

示例1
输入

5 10
BBRRR
1 2 3 6 8

输出

2

说明

1(蓝色)+3(红色)+6(红色)
2(蓝色)+8(红色)

代码
之前过了90%,才发现少了 %MOD

import functools
from lzma import MODE_FAST
n, p = map(int, input().split())
s = input()
vals = list(map(int, input().split()))

MOD = 10**9+7
@functools.lru_cache(None)
def dfs(cnt, i, f1, f2):
    if cnt>p:
        return 0
    
    if cnt==p and f1 and f2:
        return 1
    
    if i>=n:
        return 0
    
    ans = 0
    ans += dfs(cnt, i+1, f1, f2)
    ans %= MOD

    if s[i]=='B':
        ans += dfs(cnt+vals[i], i+1, True, f2)
    else:
        ans += dfs(cnt+vals[i], i+1, f1, True)
    
    ans %= MOD # 这里之前忘记MOD了
    return ans 

print(dfs(0, 0, False, False))

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值