利用问题的普遍性和特殊性来求解,代码如下:
import unittest from datetime import datetime class GetFreqNumbersFromList(unittest.TestCase): def setUp(self): print("\n") 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上的问题,自己动手写写♪(・ω・)ノ