• Python趣味小问题——找出出现次数超过数组长度一半的元素


    [本文出自天外归云的博客园]

    利用问题的普遍性和特殊性来求解,代码如下:

    import unittest
    from datetime import datetime
    
    
    class GetFreqNumbersFromList(unittest.TestCase):
        def setUp(self):
            print("
    ")
            self.start_time = datetime.now()
            print(f"{self._testMethodName} start: {self.start_time}")
    
        def tearDown(self):
            self.end_time = datetime.now()
            print(f"{self._testMethodName} end: {self.end_time}")
            exec_time = (self.end_time - self.start_time).microseconds
            print(f"{self._testMethodName} exec_time: {exec_time}")
    
        def normal_solution(self, _list, _debug=False):
            """
            普遍性解法
            利用字典记录每个元素出现的次数——然后找出元素出现次数超过数组长度一半的元素
            普遍性解法针对任何次数的统计均适用而不光只是针对出现次数超过数组长度一半的情况
            """
            _target = len(_list) // 2
            _dict = {}
            for _member in _list:
                if _member not in _dict:
                    _dict.setdefault(_member, 1)
                else:
                    _dict[_member] += 1
            _ret = [_member for _member in _dict if _dict[_member] > _target]
            if _debug:
                print(_ret)
            return _ret
    
        def specific_solution(self, _list, _debug=False):
            """
            特殊性解法
            假设有两个元素出现的次数都超过数组长度一半就会得出两个元素出现的次数超出了数组长度的矛盾结果——所以超过数组长度一半的元素是唯一的
            排序后在数组中间的一定是目标解
            特殊性解法只能针对元素出现次数超过数组长度一半的情况
            """
            _list.sort()
            if _debug:
                print(_list[len(_list) // 2])
            return _list[len(_list) // 2]
    
        def test_normal_solution(self):
            actual_result = self.normal_solution([2,2,2,2,2,2,1,1,1,1,1], False)
            self.assertEqual(actual_result[0], 2)
    
        def test_specific_solution(self):
            actual_result = self.specific_solution([2,2,2,2,2,2,1,1,1,1,1], False)
            self.assertEqual(actual_result, 2)
    
    
    if __name__ == "__main__":
        # 找出出现次数超过数组长度一半的元素
        suite = unittest.TestSuite()
        suite.addTest(GetFreqNumbersFromList('test_normal_solution'))
        suite.addTest(GetFreqNumbersFromList('test_specific_solution'))
        runner = unittest.TextTestRunner()
        runner.run(suite)

    测试结果:

    在微信公众号编程派一篇文章看到这个LeetCode上的问题,自己动手写写♪(・ω・)ノ

  • 相关阅读:
    [转载] 常用CASE工具介绍
    GridView, DataGrid 中,DataFormatString语法汇总
    [轉]SQL Server中数据类型详解
    强烈推荐asp.net数据访问的官方指南系列 (Data Access Tutorials)
    实现iFrame自适应高度,原来很简单!
    [转]Web service到底是什么?在什么情况下,你应该使用web service
    贴一个查询SQL Server数据库中所有表及其描述(Description)的SQL语句
    C#中,String和string的区别
    ERWin 连接SQL Sever2005的问题
    [转载]ERwin相关概念入门
  • 原文地址:https://www.cnblogs.com/LanTianYou/p/12156811.html
Copyright © 2020-2023  润新知