(Python基础习题)给定一个数组arr,返回arr的最长无重复元素子数组的长度

Python基础习题

给定一个数组arr,返回arr的最长无重复元素子数组的长度,无重复指的是所有数字都不同。子数组是连续的,比如[1,3,5,7,9]的子数组有[1,3],[3,5,7]等,但是[1,3,7]不是子数组

解题思路:

1,该题有多种理解,重复数字算不算连续?例如[1,3,5,5,7,9]结果是[1,3,5,7,9]还是[1,3,5]…

暂时先按去重做一遍,默认重复数字不算,结果为[1,3,5,7,9]:

去重可以计算每个量出现次数,若次数大于1,删除该量,利用循环删除:

arr = [1,3,5,5,7,9]

for i in arr:
    if arr.count(i) > 1:
        arr.remove(i)
    else:
        pass
print(arr)

运行结果:
[1, 3, 5, 7, 9]

2,去重成功,利用for循环推导式优化:

arr = [1,3,5,5,5,7,7,9]
arr1 = [arr.remove(i) for i in arr if arr.count(i) > 1]
print(arr)

运行结果:
[1, 3, 5, 7, 9]

3,统计输出字符串长度,实现人机交互

input_list = list(input('请给定一个以,隔开数组:').split(','))
arr = num_list = [int(item) for item in input_list]
arr1 = [arr.remove(i) for i in arr if arr.count(i) > 1]
print('最长无重复元素子数组的长度为:'+str(len(arr)))
print(str(arr)+'是最长数组')

运行结果:

请给定一个以,隔开数组:1,3,4,4,5,5,5,8,9,11,11,23
最长无重复元素子数组的长度为:8
[1, 3, 4, 5, 8, 9, 11, 23]是最长数组
现在按另一种考虑去解题,重复数字也算跳过则

[1,3,5,5,7,9]输出的结果应为[1,3,5]和[5,7,9]

解题思路

1,可以先将所有顺序子列表提出,然后对子列表去重,取出无重复子列表中最长的长度即可:

import copy

arr = [1,3,5,5,6,6,8,9,10,22]
num_list = []
list_list = []
uniq_list_list = []
uniq_son_list = []
len_list = []

##todo 求出列表的所有连续子列表
i = -1
for j in arr:
    i += 1
    num_list.clear()
    for item in arr[i:]:
        num_list.append(item)
        a = copy.deepcopy(num_list)
        list_list.append(a)

# print(list_list)
##todo 对所有子列表去重

for inter_list in list_list:
    uniq_set = set(inter_list)
    uniq_list = list(uniq_set)
    uniq_list_list.append(uniq_list)
# print(uniq_list_list)

##todo 对子包含子列表的列表去重(也可以省略)

for inter_list1 in uniq_list_list:
    if inter_list1 not in uniq_son_list:
        uniq_son_list.append(inter_list1)
print(uniq_son_list)

##todo  求出所有子列表长度,输出最大值

for inter_list2 in uniq_son_list:
    length = len(inter_list2)
    len_list.append(length)
# print(len_list)
print(max(len_list))

运行结果:
[1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 3, 4, 5, 6, 7, 1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 1, 2, 3, 4, 1, 2, 3, 1, 2, 1]
8

2.题目中多做了一步去重,可以省略,另外每个todo下面都可以打印出来看每一步结果,为了方便展示,没有输出,有需要可自行运行。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值