zoukankan      html  css  js  c++  java
  • 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上的问题,自己动手写写♪(・ω・)ノ

  • 相关阅读:
    C++多态
    C++和C#实现剪切板数据交互
    通过CLR API实现C++调用C#代码交互
    COM方式实现C++调用C#代码的一些总结
    输入LPCWSTR类型字符串
    取得COM对象的UUID并以string输出
    springmvc xml文件配置中使用系统环境变量
    SpringMVC,SpringBoot上传文件简洁代码
    c语言实行泛型hashmap
    java使用nio(Paths,Files)遍历文件目录,转成java.io.File
  • 原文地址:https://www.cnblogs.com/LanTianYou/p/12156811.html
Copyright © 2011-2022 走看看