题目描述:统计数组中元素重复次数并排序
解题思路:根据寻找数组中出现次数最多的元素的套路,扩展到对所有元素出现的次数统计排序
1、定义sortItemCount类,包含两个list:items用于保存数组array中的元素item、counts保存对应item的重复个数,和一个int变量length
class sortItemCount:
def __init__(self):
self.items = []
self.counts = []
self.length = 0
2、sortItemCount类包含一个insert(item)方法:
1)sortItemCount的实例中没有元素时,直接添加item,对应个数count置1
class sortItemCount:
def insert(self,item):
if self.length == 0:
self.items.append(item)
self.counts.append(1)
self.length += 1
2)已存在元素时,查看是否已经存在item,若存在,对应个数count+=1
class sortItemCount:
def insert(self,item):
if self.length == 0:
...
else:
...
for i in range(self.length):
if self.items[i] == item:
self.counts[i] += 1
...
break
3)若不存在,则直接添加item,对应个数count置1,借助标志符flag标志是否存在
class sortItemCount:
def insert(self,item):
if self.length == 0:
...
else:
flag = 0 ## here
for i in range(self.length):
if self.items[i] == item:
self.counts[i] += 1
flag = 1 ##here
...
break
## 新元素插入不用排序
if flag == 0:
self.items.append(item)
self.counts.append(1)
self.length += 1
4)回想 2),当已存在item元素时,对应个数count+=1,可能次数超过原本比它少的数据,需要重排,由于items是有序的,所以只需要部分重排
class sortItemCount:
def insert(self,item):
if self.length == 0:
...
else:
...
for i in range(self.length):
if self.item[i] == item:
...
index = i
while self.value[index] > self.value[index-1] and index > 0:
self.value[index-1] , self.value[index] = self.value[index] , self.value[index-1]
self.item[index-1] , self.item[index] = self.item[index] , self.item[index-1]
index -= 1
...
...
* python提供一种数据交换的方法:
输入:a = 1 b = 2
操作: a , b = b , a
输出: a = 2 b = 1
3、测试(完整源码在https://github.com/Elevenoo/DS/tree/master/digitalcount下载)
if __name__=='__main__':
## 键入随机数组长度,初始化值范围为0~10的随机数组
length = int(input('length = '))
array = np.random.randint(0,10,length)
for m in range(length):
print(array[m],end=' ')
## 遍历array,自定义sortItemCount保存每种元素(item)和它出现的次数(value),并排序
sIC = sortItemCount()
for m in range(length):
sIC.insert(array[m])
items = sIC.items
counts= sIC.counts
4、结果
runfile('E:/Projects/Projects_python/Day100/Test_DigitalCount.py', wdir='E:/Projects/Projects_python/Day100')
length = 10
array: 9 8 0 7 5 8 0 2 3 1
items: [8, 0, 9, 7, 5, 2, 3, 1]
counts: [2, 2, 1, 1, 1, 1, 1, 1]
写在最后:
Elevenoo is a smart and beautiful girl .