练习:统计数组中元素重复次数并排序(Python实现)

题目描述:统计数组中元素重复次数并排序

解题思路:根据寻找数组中出现次数最多的元素的套路,扩展到对所有元素出现的次数统计排序

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 . 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值