最近在练习python中遇见一道挺有意思的题目下面就分享给大家 题目如下:
有一个列表,里面有n个未知元素,其中可能存在重复的元素,让你编写一个算法除掉里面重复的元素并有序的输出各个元素及除掉的元素个数
这道题其实并不难,我们可以分三步完成
第一步需要对列表里面的元素进行除重操作,这里我们需要一个临时的列表,用于保存除重后的数据
第二步运用快速排序–归并排序–对除重元素进行排序操作
第三步运用Python中提供的切片,切掉多余的元素
全部代码如下:
#除重操作
def quchong(sum,a,b):
for i in range(0, a.__len__()):
x = 0
for j in range(i + 1, a.__len__()):
if a[i] == a[j]:
x = x + 1
sum[i] = x
for k in range(0, a.__len__()):
if sum[k] !=0:
k=k+1
else:
b[k]=a[k]
return b
#归并排序
def mergeSort(a): #归并排序
if len(a)<=1: #如果是一个元素或者空元素
return a
mid=len(a)//2 #去中间位置
left =mergeSort(a[:mid]) #归并左列表
right=mergeSort(a[mid:]) #归并右列表
return merge(left,right) #返回
def merge(left,right): #合并两个列表
merged=[]
i,j=0,0 #i和j 分别作为left 和right的下标
left_len,right_len=len(left),len(right) #分别获取左右子列表的长度
while i<left_len and j<right_len: #循环归并左右子列表元素
if left[i]<=right[j]:
merged.append(left[i]) #归并左列表
i+=1
else:
merged.append(right[j]) #归并右列表
j+=1
merged.extend(left[i:]) #归并剩余左列表
merged.extend(right[j:]) #归并剩余有列表
# print(left,right,merged) #跟踪调试
return merged
def xiao(b):
for i in range(0,b.__len__()):
if b[i]==0:
i=i+1
else:
return b[i:]
a=[1,2,3,4,5,6,7,8,9,1,3,4,5,8,10,11,1,11,111,1]
b=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
sum=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
x=0
quchong(sum,a,b)
b=mergeSort(b)
re=xiao(b)
print("除掉重复元素个数为:",a.__len__()-re.__len__())
print("除重并排序后的数据:",re)