3月7日饿了么后端暑期实习笔试~思路分享
关注我:二仙桥耐笔王 , 强力1v1辅导暑期实习&春招笔试
第1题-小红的字符串
题目内容
小红了一个串
。她将进行恰好一次以下操 作:
选择下标,交换
和
。
小红想知道,不同的操作方案,最终能生成多少不同的字符串?
输入描述
一个仅由和
构成的字符串。字符串长度不小于
,不大于
。
输出描述
一个整数,代表最终的方案数。
样例1
输入
1100			
输出
5 
思维。统计字符串中x个'0'和y个'1'答案为x*y加上当cnt0>1或cnt1>1时额外的1
s = input().strip()
s0 = s.count('0')
s1 = s.count('1')
res = s0*s1
if s0>=2 or s1>=2:
    res += 1
print(res)
第2题-小红的验证码
题目内容
小红是一个程序员,他正在开发一个验证码功能。为了正确识别机器人和真实用户,小红需要对验证码进行特殊处理。
他想出来了如下加密法:
图像+数字识别法,在一张图片中放入一个数字,例如:
这张图片机器人会识别数字 ,但是正确的识别码为 
。 给出所有的数字摆放形态:
系统将会在?处随机填入的数字,然后给出
个图片,为
,你需要按照1~m的顺序输出这
个数字以正确识别小红的系统。
输入描述
第一行一个整数,表示图片个数。
接下来共行,每行
列,表示给定的图片。输入保证仅含
和 #。
输出描述
一个整数,表示图片所所表示的正确验证码。
样例1
输入
1
#222#
#2###
#232#
###2#
#272#
输出
5 
样例2
输入
2
#222#
#2###
#232#
###2#
#272#
##1##
##1##
##1##
##1##
##1##
输出
51
模拟。直接按照9种不同的数字模块模拟即可
import sys
digitPatterns = [
        [
            "#...#",
            "#.#.#",
            "#.#.#",
            "#.#.#",
            "#...#"
        ],
        [
            "##.##",
            "##.##",
            "##.##",
            "##.##",
            "##.##"
        ],
        [
            "#...#",
            "###.#",
            "#...#",
            "#.###",
            "#...#"
        ],
        [
            "#...#",
            "###.#",
            "#...#",
            "###.#",
            "#...#"
        ],
        [
            "#.#.#",
            "#.#.#",
            "#...#",
            "###.#",
            "###.#"
        ],
        [
            "#...#",
            "#.###",
            "#...#",
            "###.#",
            "#...#"
        ],
        [
            "#...#",
            "#.###",
            "#...#",
            "#.#.#",
            "#...#"
        ],
        [
            "#...#",
            "###.#",
            "###.#",
            "###.#",
            "###.#"
        ],
        [
            "#...#",
            "#.#.#",
            "#...#",
            "#.#.#",
            "#...#"
        ],
        [
            "#...#",
            "#.#.#",
            "#...#",
            "###.#",
            "#...#"
        ]
    ]
m = sys.stdin.readline().strip('/n')
m = int(m)
inp = []
for _ in range(int(m)):
    inp.append([sys.stdin.readline().strip('/n') for _ in range(5)])
for i in range(m):
    for j in range(5):
        st = ""
        for k in range(5):
            if inp[i][j][k] != "#":
                st += "."
            else:
                st += "#"
        inp[i][j] = st
ans = []
for i in range(m):
    for j in range(10):
        jud = True
        for k in range(5):
            if inp[i][k] != digitPatterns[j][k]:
                jud = False
                break
        if jud:
            ans.append(str(j))
            break
print("".join(ans))
第3题-小红玩游戏
题目内容
小红最近想到了一个好玩的游戏,这个游戏一共会进行轮,每一轮,小红会从下方三种操作中选择一种进行:
在黑板上写一个整数; 擦去黑板上的一个整数
(此操作之前保证黑板上有这个整数); 询问黑板上哪个数字与整数
的异或值最大(若黑板上此时没有数字,则输出 
)。 对于每一次询问操作,你需要告诉他答案。
输入描述
第一行输入一个正整数代表操作的轮数。
此后几行,每行先输入一个整数代表操作类型,编号同题干;随后在同一行输入一个整数 
代表操作的参数。
除此之外,保证存在至少一次询问操作。
输出描述
对于每一次询问操作,输出一个整数,代表答案。
样例1
输入
10
1 5
1 7
1 4
3 8
2 4
1 2
1 6
3 9
2 6
3 9
输出
15
15
14
题解
题面描述
题目给定一个游戏,共进行  轮操作。每一轮操作中可以选择以下三种之一:
- 插入操作:在黑板上写入一个整数 
;
 - 删除操作:擦去黑板上一个整数 
(题目保证该整数在黑板中一定存在);
 - 询问操作:查询黑板上哪个数字与给定整数 
的异或值最大。如果黑板为空,则输出
。
 
题目保证至少存在一次询问操作。
字典树。字典树模版题,三种不同的操作对应字典树的插入,删除,查找最大异或值
# 定义字典树节点类
class TrieNode:
    def __init__(self):
        self.child = [None, None]  # 两个分支,分别代表 0 和 1
        self.cnt = 0               # 经过该节点的数字个数
# 插入数字 x 到字典树中
def insert(root, x):
    node = root
    node.cnt += 1
    # 固定使用 32 位(或 31 位,根据题目数字范围;这里用 32 位保证万无一失)
    for i in range(31, -1, -1):
        bit = (x >> i) & 1
        if node.child[bit] is None:
            node.child[bit] = TrieNode()
        node = node.child[bit]
        node.cnt += 1
# 删除数字 x 从字典树中(保证 x 存在)
def remove(root, x):
    node = root
    node.cnt -= 1
    for i in range(31, -1, -1):
        bit = (x >> i) & 1
        node = node.child[bit]
        node.cnt -= 1
# 查询给定 x 与字典树中数字异或值的最大值
def query(root, x):
    # 如果黑板(字典树)为空,则返回 -1
    if root.cnt == 0:
        return -1
    node = root
    res = 0
    for i in range(31, -1, -1):
        bit = (x >> i) & 1
        opp = 1 - bit  # 优先选择相反的位
        if node.child[opp] is not None and node.child[opp].cnt > 0:
            res |= (1 << i)
            node = node.child[opp]
        else:
            node = node.child[bit]
    return res
if __name__ == '__main__':
    # import sys
    # input = sys.stdin.readline
    n = int(input().strip())
    root = TrieNode()
    for _ in range(n):
        parts = input().split()
        op = int(parts[0])
        x = int(parts[1])
        if op == 1:
            insert(root, x)
        elif op == 2:
            remove(root, x)
        elif op == 3:
            print(query(root, x))
#我的求职思考##技术岗笔试题求解##双非应该如何逆袭?##实习/项目/竞赛奖项,哪个对找工作更重要?##饿了么求职进展汇总#
查看14道真题和解析