Python 找出出現(xiàn)次數(shù)超過(guò)數(shù)組長(zhǎng)度一半的元素實(shí)例
利用問(wèn)題的普遍性和特殊性來(lái)求解,
代碼如下:
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):
"""
普遍性解法
利用字典記錄每個(gè)元素出現(xiàn)的次數(shù)——然后找出元素出現(xiàn)次數(shù)超過(guò)數(shù)組長(zhǎng)度一半的元素
普遍性解法針對(duì)任何次數(shù)的統(tǒng)計(jì)均適用而不光只是針對(duì)出現(xiàn)次數(shù)超過(guò)數(shù)組長(zhǎng)度一半的情況
"""
_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):
"""
特殊性解法
假設(shè)有兩個(gè)元素出現(xiàn)的次數(shù)都超過(guò)數(shù)組長(zhǎng)度一半就會(huì)得出兩個(gè)元素出現(xiàn)的次數(shù)超出了數(shù)組長(zhǎng)度的矛盾結(jié)果——所以超過(guò)數(shù)組長(zhǎng)度一半的元素是唯一的
排序后在數(shù)組中間的一定是目標(biāo)解
特殊性解法只能針對(duì)元素出現(xiàn)次數(shù)超過(guò)數(shù)組長(zhǎng)度一半的情況
"""
_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__":
# 找出出現(xiàn)次數(shù)超過(guò)數(shù)組長(zhǎng)度一半的元素
suite = unittest.TestSuite()
suite.addTest(GetFreqNumbersFromList('test_normal_solution'))
suite.addTest(GetFreqNumbersFromList('test_specific_solution'))
runner = unittest.TextTestRunner()
runner.run(suite)
測(cè)試結(jié)果:

補(bǔ)充知識(shí):Python 用積分思想計(jì)算圓周率
早上起來(lái)突然想求圓周率,1單位時(shí)圓的面積。
代碼如下:
from math import pow, sqrt
def calc_circle_s_with(r, dy, x_slices):
x_from_start_to_cc = sqrt(1 - pow(dy, 2))
dx = x_from_start_to_cc / x_slices
x_to_edge = 1 - x_from_start_to_cc
quarter_circle_s = 0
while x_to_edge < 1:
rect_s = dy * dx
quarter_circle_s += rect_s
x_to_edge = x_to_edge + dx
dy = sqrt(1 - pow((1 - x_to_edge), 2))
circle_s = 4 * quarter_circle_s
print(circle_s)
calc_circle_s_with(1, 0.0001, 10000000)
運(yùn)行結(jié)果接近3.1415926,dy傳的越小,x_slices傳的越大,就越接近。
半徑為:1
初始小矩形到圓周的距離:1 - x_from_start_to_cc
其中dy代表四分之一圓中初始小矩形的高度,x_slices代表小矩形的寬度:(1 - x_from_start_to_cc) / x_slices
四分之一圓的面積積分為:quarter_circle_s
以上這篇Python 找出出現(xiàn)次數(shù)超過(guò)數(shù)組長(zhǎng)度一半的元素實(shí)例就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
python 中 .py文件 轉(zhuǎn) .pyd文件的操作
這篇文章主要介紹了python 中 .py文件 轉(zhuǎn) .pyd文件的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-03-03
python openpyxl 帶格式復(fù)制表格的實(shí)現(xiàn)
這篇文章主要介紹了python openpyxl 帶格式復(fù)制表格的實(shí)現(xiàn)操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-03-03
Django migrations 默認(rèn)目錄修改的方法教程
這篇文章主要介紹了Django migrations 默認(rèn)目錄修改的方法教程,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-09-09
Python數(shù)據(jù)可視化之用Matplotlib繪制常用圖形
Matplotlib能夠繪制折線圖、散點(diǎn)圖、柱狀圖、直方圖、餅圖. 我們需要知道不同的統(tǒng)計(jì)圖的意義,以此來(lái)決定選擇哪種統(tǒng)計(jì)圖來(lái)呈現(xiàn)我們的數(shù)據(jù),今天就帶大家詳細(xì)了解如何繪制這些常用圖形,需要的朋友可以參考下2021-06-06
Python實(shí)現(xiàn)疫苗接種管理數(shù)據(jù)庫(kù)步驟詳解
這篇文章主要為大家介紹了Python實(shí)現(xiàn)疫苗接種管理數(shù)據(jù)庫(kù)步驟詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09

