美文网首页
Python编程题13--判断两个升序列表,其中一个是另外一个的

Python编程题13--判断两个升序列表,其中一个是另外一个的

作者: wintests | 来源:发表于2020-10-08 09:37 被阅读0次

题目

已知两个升序列表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))

更多Python编程题,等你来挑战:Python编程题汇总(持续更新中……)

相关文章

  • Python编程题13--判断两个升序列表,其中一个是另外一个的

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

  • 学习记录17.7.30

    编程部分 Python列表,元组,条件判断,循环,函数定义,切片 Leetcode题目5题(分别用Python,C...

  • python 内置排序函数使用

    python内置关于排序的工具主要有两个一个是列表自带的sort()方法,另外一个是sorted()函数。Pyth...

  • 实验吧编程-找素数

    最近比较低沉,事情比较多,做一道简单编程题吧。。。这个题不外乎就是两个方面,一个是判断素数,一个是生成等差数列,那...

  • Python习题册025:判断元素是否在列表

    任务025描述 用Python编写一个程序,输入两个参数,其中一个为列表类型,要求判断列表中是否包括另一个参数。如...

  • 面试题-概率题

    题1:有人有两个孩子,已知其中一个是男孩,另外一个也是男孩的概率。 题2:一个村庄中间隔着一条河,一边有30万人,...

  • Python之map(),reduce()

    Python内建函数map()接受两个参数,一个是函数,一个是可迭代对象(可以是列表,元组等等)序列。map(函数...

  • RedHat/CentOS独立编译安装Python3.5.2(自

    要开始学习Python编程,首先就得把Python安装到你的电脑里。目前,Python有两个版本,一个是2.x版,...

  • 「Python」身份运算符——is 与 is not

    在python中有两个身份运算符,一个是is另外一个是is not。 作用:身份运算符用于比较两个对象的内存地址是...

  • 第3章 列表简介

    参考书籍:《Python编程 从入门到实践》 1. 列表的定义和访问 用方括号[]表示列表,并用逗号分隔开其中的元...

网友评论

      本文标题:Python编程题13--判断两个升序列表,其中一个是另外一个的

      本文链接:https://www.haomeiwen.com/subject/rvhhdktx.html