zoukankan      html  css  js  c++  java
  • 算法试题

    题目

    查询多个字典中的公共键, 题目实例

    每轮比赛 6个人 都有可能得分, 3轮下来都得分的有谁?

    每轮比赛 6个人 都有可能得分, n 轮下来都得分的有谁?

    解析

    思路一

    遍历第一轮的记录, 用键来比对二轮,三轮都有此键的情况进行记录

    稍微有点啰嗦, 执行效率不是很好, 而且对于 n 的处理也比较麻烦

    思路二

    利用集合的交集进行便携的查询,

    然后使用 map 函数进行将所有轮字典分别转换成一个集合然后集中在一个容器中

    然后利用 reduce 函数对这个容器内的所有集合元素进行 &  操作取交集

    答案

    答案一

    import random
    
    res1 = random.sample("abcdefg", random.randint(3, 6))
    res2 = random.sample("abcdefg", random.randint(3, 6))
    res3 = random.sample("abcdefg", random.randint(3, 6))
    
    s1 = {k: random.randint(1, 3) for k in res1}
    s2 = {k: random.randint(1, 3) for k in res2}
    s3 = {k: random.randint(1, 3) for k in res3}
    print(s1)
    print(s2)
    print(s3)
    
    l = []
    for k in s1:
        if k in s2 and k in s3:
            l.append(k)
    print(l)

    答案二

    import random
    from functools import reduce
    from pprint import pprint
    
    n = 3
    li = []
    while n:
        res = random.sample("abcdefg", random.randint(3, 6))
        s = {k: random.randint(1, 3) for k in res}
        li.append(s)
        n -= 1
    
    pprint(li)
    """
    [{'a': 3, 'b': 2, 'c': 1, 'd': 3, 'f': 3, 'g': 2},
     {'b': 1, 'c': 2, 'e': 3, 'g': 1},
     {'a': 2, 'c': 3, 'f': 3}]
    """
    
    res = list(map(set, li))
    print(res)  # [{'f', 'c', 'b', 'g', 'a', 'd'}, {'e', 'g', 'c', 'b'}, {'f', 'c', 'a'}]
    
    res = reduce(lambda a, b: a & b, res)
    print(res)  # {'c'}
  • 相关阅读:
    Docker 使用Calico插件配置网络
    Fluentd插件rewrite-tag-filter介绍
    Fluentd Regexp patterns
    gdb 打印数据结构
    g++ -g
    《100-gdb-tips》——查看调用堆栈
    dbghelp.dll 定位异常奔溃信息
    debug skill:烫烫烫屯屯屯
    sizeof()和strlen()的区别
    指针和引用的区别
  • 原文地址:https://www.cnblogs.com/shijieli/p/10864838.html
Copyright © 2011-2022 走看看