少儿Python每日一题(20):整数去重操作

原题解答

本次的题目如下所示:

给定一个整数的序列,要求对这个序列进行去重操作。所谓去重,是指对这个序列中每个重复出现的数,只保留该数第一次出现的位置,删除其余位置。
输入格式
输入一行,n 个整数,整数之间以一个空格分开。每个整数大于等于 10 、小于等于 100。
输出格式
输出一行,按照输入的顺序输出其中不重复的数字,整数之间用一个空格分开。
输入样例:
10 12 98 18 12 18 21
输出样例:
10 12 98 18 21

 本题是一个典型的去重问题,去重问题的处理方式有很多,我们这里介绍一下常用的去重方法:

一、集合去重法

Python中的集合类型具有元素不重复的特征,如果使用将列表转换成集合,再转换回列表类型,重复的值将自动去除掉。该方法虽然简单,但是会带来一个问题:集合是一个无序序列,将列表转换为集合,再由集合转换成列表后,结果的顺序不受控制,会造成失分

这种方法在实际做题中不建议使用,但是在实际应用中却十分方便,因此我们在这里提一下。我们看一下具体的代码:

a = list(map(int, input().split()))
a = set(a)
a = list(a)
print(*a)

程序运行的结果为:

98 10 12 18 21

该方法虽然实现了去重的功能,但是结果的顺序并未符合题目的要求。

二、遍历筛选法

我们可以对元素进行遍历,将元素存入一个新的列表中。并对每个元素进行判断,如果新列表中该元素不存在,则添加;如果新列表中已经含有该元素,则不添加。该方法从第一个元素开始遍历到最后一个元素,确保了在去重过程中元素的顺序。

a = list(map(int, input().split()))
b = []
for item in a:
    if item not in b:
        b.append(item)
print(*b)

使用该方法结果与题目的要求相符,实现了去重并保证了新列表保持了原有的顺序。

本题拓展

本题考查的是数据去重的操作,题目难度★★

数据去重的题型除了保留唯一值之外,还有去除连续相同的值,基本的思路还是一致。都是使用一边遍历一边筛选的方法。我们看下面这道题(题目来源:洛谷):

一组数,分别表示地平线的高度变化。高度值为整数,相邻高度用直线连接。找出并统计有多少个可能积水的低洼地?
如图:地高变化为 0 1 0 2 1 2 0 0 2 0


输入格式
连续n个数表示地平线高度变化的数据,保证首尾为0。(3<=n<=10000,0<=高度<=1000)
输出格式
一个数,可能积水低洼地的数目。
输入样例
0 1 0 2 1 2 0 0 2 0
输出样例
3

通过题目的条件,我们可以得出,两边的高度都比它高,那就会形成一块“低洼地”。因此,我们只需要进行大小判断即可。但问题在于,有可能会出现连续相同的数,如图中③的位置所示。

我们在进行大小判断之前,先得去除连续相同的数。在连续相同的数字都去除掉以后,我们就可以比较一个数是否前面的和后面的两个数都比它大,满足条件就是一块“低洼地”。

通过该思路的分析,我们得到程序的代码如下所示:

a = list(map(int, input().split()))
b = []
n = 0
b.append(a[0]) # b列表中先添加第一个元素
for i in range(1, len(a)): # 从第2个元素开始遍历
    if a[i] != a[i-1]: 
        b.append(a[i])  # 如果当前遍历到元素不等于前面一个元素,则添加
for i in range(1, len(b) - 1):
    if b[i] < b[i-1] and b[i] < b[i+1]:
        n += 1 # 如果当前值同时满足小于前后的值,则为低洼地
print(n)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

凤城老人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值