zoukankan      html  css  js  c++  java
  • Python编程题13--判断两个升序列表,其中一个是另外一个的子集

    题目

    已知两个升序列表A、B,列表A的元素个数要小于列表B,请判断列表A是否是列表B的子集,如果是则返回 True ,否则返回 False 。

    如果列表A是列表B的子集,需要满足以下两个条件:

    • 列表A的所有元素都能在列表B中找到;
    • 列表A中重复元素的个数不能大于列表B中重复元素的个数。

    实现思路1

    这里我们运用 Python 里面 集合 的 issubset() 方法来处理问题。

    • 分别把列表A和列表B转换为新的两个集合,通过 set(列表名) 来完成
    • 通过集合的 issubset() 方法,判断集合的所有元素是否都包含在指定集合中,如果是则返回 True,否则返回 False

    注意:因为集合是不包含重复元素的,如果列表A或列表B包含重复元素,那么转换为集合时会进行去重,也就不能直接使用 issubset() 方法来实现。

    代码实现

    def is_sub_set(short_list, long_list):
        set1, set2 = set(short_list), set(long_list)
        return set1.issubset(set2)
    
    # 列表A和列表B不包含重复元素    
    A = [1, 2, 4, 5]
    B = [1, 2, 3, 4, 5, 6, 7]
    print(is_sub_set(A, B))
    

    实现思路2

    • 求出列表A和列表B的长度 len1、len2,并设置两个变量 x、y ,分别用于标记列表A和列表B的索引下标
    • 使用 while 循环语句,只要同时满足 x索引下标小于 len1、y索引下标小于 len2 ,那么就一直就行循环,否则说明列表A或列表B已经遍历结束
    • 循环过程中,如果列表A下标为 x 的元素,恰等于列表B下标为 y 的元素,那么说明A、B均存在该元素,所以让 x、y 索引下标均加1,继续往下进行比较
    • 如果列表A下标为 x 的元素,大于列表B下标为 y 的元素,那么让 y 加1,x 保持不变,继续往下进行比较
    • 如果列表A下标为 x 的元素,小于列表B下标为 y 的元素,而A、B均为升序列表,那么就说明列表A的这个元素,一定不存在于列表B中,所以直接返回 False
    • 循环结束后,只需比较列表A的索引下标 x ,是否等于其长度 len1 ,如果等于则说明 列表A 是列表B的子集

    代码实现

    def is_sub_set(short_list, long_list):
        len1, len2 = len(short_list), len(long_list)
        x, y = 0, 0
        while x < len1 and y < len2:
            if short_list[x] == long_list[y]:
                x += 1
                y += 1
            elif short_list[x] > long_list[y]:
                y += 1
            else:
                return False
        return True if x == len1 else False
            
    A = [1, 2, 3, 3, 4, 5]
    B = [1, 2, 2, 3, 3, 4, 4, 5, 5, 6]
    print(is_sub_set(A, B))
    

    实现思路3

    • 求出列表A和列表B的长度 len1、len2,并设置两个变量 m、flag,m 用于标记列表A中有 m 个元素存在于列表B中,flag 用于标记列表A是否为B的子集
    • 遍历列表B,每次将列表B的元素,与列表A的第一个元素进行比较,如果相等,那么让 m 加1,并把列表A的第一个元素从列表中删除
    • 如果 m 等于 len1, 那么表示列表A的元素均存在与列表B中,且其重复元素个数肯定小于列表B中重复元素的个数,所以将 flag 置为 True,并通过 break 结束循环

    代码实现

    def is_sub_set(short_list, long_list):
        len1, len2 = len(short_list), len(long_list)
        m = 0
        flag = False
        for i in range(len2):
            if long_list[i] == short_list[0]:
                m += 1
                if m == len1:
                    flag = True
                    break
                del short_list[0]
        return flag
    
    A = [1, 2, 3, 3, 4, 5]
    B = [1, 2, 2, 3, 3, 4, 4, 5, 5, 6]
    print(is_sub_set(A, B))
    
  • 相关阅读:
    Flutter form 的表单 input
    FloatingActionButton 实现类似 闲鱼 App 底部导航凸起按钮
    Flutter 中的常见的按钮组件 以及自 定义按钮组件
    Drawer 侧边栏、以及侧边栏内 容布局
    AppBar 自定义顶部导航按钮 图标、颜色 以及 TabBar 定义顶部 Tab 切换 通过TabController 定义TabBar
    清空路由 路由替换 返回到根路由
    应对ubuntu linux图形界面卡住的方法
    [转] 一块赚零花钱
    [转]在树莓派上搭建LAMP服务
    ssh保持连接
  • 原文地址:https://www.cnblogs.com/wintest/p/13780334.html
Copyright © 2011-2022 走看看