经典算法题总结
第一題:遞歸
1.給一個(gè)dict或者json 求 value大于53 并且為int 將該value 轉(zhuǎn)換為str
mydict1 = {"a":{"a":[1,2,3]},"b":{"b":1}}def Foo(mydict):for _,v in mydict.items():if isinstance(v,dict):Foo(v)elif isinstance(v,int) and ord(v) > 53:v = str(v)elif isinstance(v,list):for i in v :Foo(i)elif isinstance(v,tuple):for i in v:Foo(i)
第二題:邏輯
2. 給一個(gè)數(shù)組 [7,3,5,6,4]? 最大值不能在比他小的值前面,求最大值和最小值的差?
?
a = [7,3,5,6,4]big = 0 small = 0 index = 0 for i in a:if small == 0:small = iif i > big:if index+1 == len(a):if i > big:big = ielif i > a[index+1]:passelse:big = iif i < small:small = iindex += 1 #0 1 2over = big - smallprint(over)按照這種姿勢(shì)求:
?
?
第三題:python生成器
#!/usr/bin/python # -*- coding:utf-8 -*- i = [1,2,3,4]u = (j for j in i)#通過(guò)列表生成式,變成了個(gè)生成器print(u,type(u))""" <generator object <genexpr> at 0x10457af10> <class 'generator'> """?
第四題:單例模式
import threadingimport time class singleclass(object):_instance_lock = threading.Lock()def __init__(self):time.sleep(1) #加入sleep之后就看出來(lái)內(nèi)存地址不一致,這種情況需要考慮加鎖解決@classmethoddef instance(cls,*args,**kwargs):if not hasattr(singleclass,"_instance"):with singleclass._instance_lock:if not hasattr(singleclass,"_instance"):singleclass._instance = singleclass(*args,**kwargs)return singleclass._instancedef task():obj = singleclass.instance()print(obj)for i in range(100):t = threading.Thread(target=task)t.start()基于裝飾器的單例模式:
#!/usr/bin/python # -*- coding:utf-8 -*- import threadingdef Singleton(cls):_instance_lock = threading.RLock()_instance = {}def _singleton(*args,**kwargs):if cls not in _instance:with _instance_lock:_instance[cls] = cls(*args,**kwargs)return _instance[cls]return _singleton@Singleton class A(object):a = 1def __init__(self, x=0):self.x = xa1 = A(2) a2 = A(3) print(id(a1))print(id(a2))print(a1.x)print(a2.x)?
代碼解析:
代碼分析:第1行,創(chuàng)建外層函數(shù)singleton,可以傳入類第2行,創(chuàng)建一個(gè)instances字典用來(lái)保存單例第3行,創(chuàng)建一個(gè)內(nèi)層函數(shù)來(lái)獲得單例第4,5,6行, 判斷instances字典中是否含有單例,如果沒(méi)有就創(chuàng)建單例并保存到instances字典中,然后返回該單例第7行, 返回內(nèi)層函數(shù)get_instance#創(chuàng)建一個(gè)帶有裝飾器的類@singletonclass Student:def __init__(self, name, age):self.name = nameself.age = age在Python中認(rèn)為“一切皆對(duì)象”,類(元類除外)、函數(shù)都可以看作是對(duì)象,既然是對(duì)象就可以作為參數(shù)在函數(shù)中傳遞,我們現(xiàn)在來(lái)調(diào)用Student類來(lái)創(chuàng)建實(shí)例,看看實(shí)現(xiàn)過(guò)程。#創(chuàng)建student實(shí)例student = Student(jiang, 25)@singleton相當(dāng)于Student = singleton(Student),在創(chuàng)建實(shí)例對(duì)象時(shí)會(huì)先將 Student 作為參數(shù)傳入到 singleton 函數(shù)中,函數(shù)在執(zhí)行過(guò)程中不會(huì)執(zhí)行 get_instance 函數(shù)(函數(shù)只有調(diào)用才會(huì)執(zhí)行),直接返回get_instance函數(shù)名。此時(shí)可以看作Student = get_instance,創(chuàng)建實(shí)例時(shí)相當(dāng)于student = get_instance(jiang, 25),調(diào)用get_instance 函數(shù),先判斷實(shí)例是否在字典中,如果在直接從字典中獲取并返回,如果不在執(zhí)行 instances [cls] = Student(jiang, 25),然后返回該實(shí)例對(duì)象并賦值非student變量,即student = instances[cls]。?
第五題 super解析:
class BaseResponse(object):def __init__(self):print(123)class LikeResponse(BaseResponse):def __init__(self):self.code = 0super(LikeResponse,self).__init__()#執(zhí)行父類的__init__()方法if __name__ == '__main__':g = LikeResponse()""" 123"""
第六題 linux shell 腳本中冒號(hào)的意思(:)
: 在shell里是什么都不做,但返回值為真 例如 while :; docommand done或者for i in `seq 1 10`; do: done 此處相當(dāng)于python里的pass
第七題: linux shell腳本中?
ETCD_NAME=${1:-"default"} #如果$1沒(méi)傳遞數(shù)據(jù) 默認(rèn)值就是default ETCD_LISTEN_IP=${2:-"0.0.0.0"} ETCD_INITIAL_CLUSTER=${3:-}?
第八題:python 列表引用類型
def f(x,l=[]):for i in range(x):l.append(i*i)print(l)f(2) f(3,[1,2,3]) f(3)""" [0, 1] [1, 2, 3, 0, 1, 4] [0, 1, 0, 1, 4] """
?第九題:二分查找非遞歸方法
二分查找:我們手里有一個(gè)長(zhǎng)度為n的正序數(shù)列,當(dāng)我們想查找一個(gè)數(shù) x是否在這個(gè)數(shù)列當(dāng)中的時(shí)候
1 取數(shù)列正中間的數(shù)mid,
如果mid和x相等,則找到結(jié)果,查找成功 返回True
如果mid比x大,則x應(yīng)該在mid的左側(cè),我們把mid左側(cè)當(dāng)作一個(gè)新的數(shù)列l(wèi)i
如果mid比x小,則x應(yīng)該在mid的右側(cè),我們把mid右側(cè)當(dāng)作一個(gè)新的數(shù)列l(wèi)i
2 對(duì)于新的數(shù)列l(wèi)i 進(jìn)行1的查找工作
3 一直重復(fù)上面查找,生成新的數(shù)列l(wèi)i為空的時(shí)候則 數(shù)列當(dāng)中沒(méi)有數(shù)x 返回False
時(shí)間復(fù)雜度:最優(yōu)O(1) 我們?nèi)〉谝淮沃虚g數(shù)mid 找到了 這種概率很低
最壞O(log n) 假設(shè)n個(gè)數(shù)的數(shù)列,每次把數(shù)列分成兩半,n除以多少次2 等于1 呢? log n次
遞歸實(shí)現(xiàn)二分法查找 #遞歸實(shí)現(xiàn)二分查找 li是列表 item是要查找的元素 def merge_search( li ,item ):#傳來(lái)的列表每次都是新生成的,如果發(fā)現(xiàn)里面沒(méi)有元素,則是查找到盡頭都沒(méi)找到if not li :return Falsemid = len(li)//2 #mid記錄li的中間位置#檢查一下 如果中間這個(gè)數(shù)就是要找的元素 返回真if li[mid] == item :return True# 如果mid比item大,說(shuō)明item可能會(huì)出現(xiàn)在mid左邊,對(duì)左邊再查找elif li[mid]> item :return merge_search( li[:mid] ,item )# mid 比item小,說(shuō)明item有可能在mid右邊,對(duì)右邊再查找else :return merge_search( li[mid+1:] , item )if __name__ == '__main__':li = [1,2,3,4,5,6,7]print( merge_search(li , 0) ) #Falseprint( merge_search(li , 1) ) #True
?非遞歸查詢
def merge_search( li , item ):#獲取li的開始 結(jié)束start = 0end = len(li)-1#只要start和end 還沒(méi)錯(cuò)開 就一直找while start <= end :#通過(guò)計(jì)算獲取當(dāng)前查找范圍的中間位置mid = (start + end)//2#如果中間數(shù)就是item則返回Trueif li[mid] == item :return True#如果mid比item大,說(shuō)明item可能會(huì)出現(xiàn)在mid左邊,對(duì)左邊再查找elif li[mid]> item :end = mid - 1# mid 比item小,說(shuō)明item有可能在mid右邊,對(duì)右邊再查找else :start = mid + 1#跳出循環(huán)說(shuō)明沒(méi)找到 返回錯(cuò)誤return Falseif __name__ == '__main__':li = [1,2,3,4,5,6,7,8]print( merge_search(li , 8) ) #Trueprint( merge_search(li , 0) ) #False
?算法題:
兩個(gè)乒乓球隊(duì)進(jìn)行比賽,各出三人。甲隊(duì)為a,b,c三人,乙隊(duì)為x,y,z三人。已抽簽決定比賽名單。有人向隊(duì)員打聽(tīng)比賽的名單。a說(shuō)他不和x比,c說(shuō)他不和x,z比,請(qǐng)編程序找出三隊(duì)賽手的名單。
import itertoolsfor i in itertools.permutations('xyz'):if i[0] != 'x' and i[2] != 'x' and i[2] != 'z':print('a vs %s, b vs %s, c vs %s' % (i[0], i[1], i[2]))?
求一個(gè)字符串最長(zhǎng)不重復(fù)子串
#!/usr/bin/python # -*- coding:utf-8 -*-def max_string(st):# 設(shè)置一個(gè)result list + 一個(gè)max# 考察的問(wèn)題,如果對(duì)中間list 進(jìn)行截取,這個(gè)時(shí)候要考慮,我截取完的list# 要將新數(shù)據(jù)append進(jìn)去,然后在去求一下,長(zhǎng)度和max去比較,只有大于max才可以存到最終的結(jié)果里tmp = []result = []max_len = 0for i in st:if i in result:if result.index(i) == len(result) -1:result = []result.append(i)if len(result) > max_len:max_len = len(result)tmp = resultelse:result = result[result.index(i)+1:]result.append(i)if len(result) > max_len:max_len = len(result)tmp = resultelse:result.append(i)if len(result) > max_len:max_len = len(result)tmp = resultprint(tmp)if __name__ == '__main__':st = "abcadefdhigkg"max_string(st)""" output ['e', 'f', 'd', 'h', 'i', 'g', 'k']"""
?
?
轉(zhuǎn)載于:https://www.cnblogs.com/liujiliang/p/9176961.html
總結(jié)
- 上一篇: React-navigation之Sta
- 下一篇: 6.13spring随笔