3.20 阿里笔试题目

  1. 有一叠扑克牌,每张牌介于1和10之间. 有四种出牌方法:
    单出1张、出2张对子、出五张顺子,如12345、出三连对子,如112233. 给10个数,表示1-10每种牌有几张,问最少要多少次能出完

注: 加入memory字典,能加快速度,否则会超时. 有人称这种方法为记忆化回溯搜索.

def dfs(l):
    if sum(l) == 0:
        return 0
    elif tuple(l) in memory:
        return memory[tuple(l)]
    else:
        res = float('inf')
        for i in range(10):
            # 顺子
            if i < 6 and l[i] > 0 and l[i+1] > 0 and l[i+2] > 0 and l[i+3] > 0 and l[i+4] > 0:
                l[i] -= 1
                l[i+1] -= 1
                l[i+2] -= 1
                l[i+3] -= 1
                l[i+4] -= 1
                res = min(res, dfs(l) + 1)
                l[i] += 1
                l[i + 1] += 1
                l[i + 2] += 1
                l[i + 3] += 1
                l[i + 4] += 1
                memory[tuple(l)] = res
            # 连对
            if i < 8 and l[i] > 1 and l[i+1] > 1 and l[i+2] > 1:
                l[i] -= 2
                l[i+1] -= 2
                l[i+2] -= 2
                res = min(res, dfs(l) + 1)
                l[i] += 2
                l[i + 1] += 2
                l[i + 2] += 2
                memory[tuple(l)] = res
            # 对子
            if l[i] > 1:
                l[i] -= 2
                res = min(res, dfs(l) + 1)
                l[i] += 2
                memory[tuple(l)] = res
            # 单牌
            if l[i] > 0:
                l[i] -= 1
                res = min(res, dfs(l) + 1)
                l[i] += 1
                memory[tuple(l)] = res
        return res


if __name__ == '__main__':
    l = list(map(int, input().strip().split()))
    memory = {}
    print(dfs(l))
  1. 定义上升字符串,s[i] >= s[i-1], 比如aaa, abc, acb不是
    给定n个上升字符串,选择任意个拼起来,问能拼出来的最长上升字符串长度
def solution(l):
    # 存储到当前字符串位置的最长长度
    # 每一个值都是找到前面满足条件(当前字符串首字母大于等于前面字符串的末尾字母)的最长长度加上当前字符串长度
    if len(l) < 1:
        return 0
    else:
        init = []
        # 对l按首字母排序
        sort_l = sorted(l)
        init.append(len(sort_l[0]))
        for i in range(1, len(sort_l)):
            max_len = 0
            # 遍历前面字符串
            for j in range(i):
                # 如果当前字符串首字母大于等于前面字符串的末尾字母
                if sort_l[i][0] >= sort_l[j][-1]:
                    if (len(sort_l[i]) + init[j]) > max_len:
                        max_len = len(sort_l[i]) + init[j]
            init.append(max_len)
        return max(init)


if __name__ == '__main__':
    n = int(input())
    l = []
    for i in range(n):
        str = input()
        l.append(str)
    result = solution(l)
    print(result)

你可能感兴趣的:(算法笔试真题,阿里笔试真题)