经典算法题总结
第一題:遞歸
1.給一個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. 給一個數(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)按照這種姿勢求:
?
?
第三題:python生成器
#!/usr/bin/python # -*- coding:utf-8 -*- i = [1,2,3,4]u = (j for j in i)#通過列表生成式,變成了個生成器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之后就看出來內(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)建一個instances字典用來保存單例第3行,創(chuàng)建一個內(nèi)層函數(shù)來獲得單例第4,5,6行, 判斷instances字典中是否含有單例,如果沒有就創(chuàng)建單例并保存到instances字典中,然后返回該單例第7行, 返回內(nèi)層函數(shù)get_instance#創(chuàng)建一個帶有裝飾器的類@singletonclass Student:def __init__(self, name, age):self.name = nameself.age = age在Python中認為“一切皆對象”,類(元類除外)、函數(shù)都可以看作是對象,既然是對象就可以作為參數(shù)在函數(shù)中傳遞,我們現(xiàn)在來調(diào)用Student類來創(chuàng)建實例,看看實現(xiàn)過程。#創(chuàng)建student實例student = Student(jiang, 25)@singleton相當于Student = singleton(Student),在創(chuàng)建實例對象時會先將 Student 作為參數(shù)傳入到 singleton 函數(shù)中,函數(shù)在執(zhí)行過程中不會執(zhí)行 get_instance 函數(shù)(函數(shù)只有調(diào)用才會執(zhí)行),直接返回get_instance函數(shù)名。此時可以看作Student = get_instance,創(chuàng)建實例時相當于student = get_instance(jiang, 25),調(diào)用get_instance 函數(shù),先判斷實例是否在字典中,如果在直接從字典中獲取并返回,如果不在執(zhí)行 instances [cls] = Student(jiang, 25),然后返回該實例對象并賦值非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 腳本中冒號的意思(:)
: 在shell里是什么都不做,但返回值為真 例如 while :; docommand done或者for i in `seq 1 10`; do: done 此處相當于python里的pass
第七題: linux shell腳本中?
ETCD_NAME=${1:-"default"} #如果$1沒傳遞數(shù)據(jù) 默認值就是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] """
?第九題:二分查找非遞歸方法
二分查找:我們手里有一個長度為n的正序數(shù)列,當我們想查找一個數(shù) x是否在這個數(shù)列當中的時候
1 取數(shù)列正中間的數(shù)mid,
如果mid和x相等,則找到結(jié)果,查找成功 返回True
如果mid比x大,則x應(yīng)該在mid的左側(cè),我們把mid左側(cè)當作一個新的數(shù)列l(wèi)i
如果mid比x小,則x應(yīng)該在mid的右側(cè),我們把mid右側(cè)當作一個新的數(shù)列l(wèi)i
2 對于新的數(shù)列l(wèi)i 進行1的查找工作
3 一直重復(fù)上面查找,生成新的數(shù)列l(wèi)i為空的時候則 數(shù)列當中沒有數(shù)x 返回False
時間復(fù)雜度:最優(yōu)O(1) 我們?nèi)〉谝淮沃虚g數(shù)mid 找到了 這種概率很低
最壞O(log n) 假設(shè)n個數(shù)的數(shù)列,每次把數(shù)列分成兩半,n除以多少次2 等于1 呢? log n次
遞歸實現(xiàn)二分法查找 #遞歸實現(xiàn)二分查找 li是列表 item是要查找的元素 def merge_search( li ,item ):#傳來的列表每次都是新生成的,如果發(fā)現(xiàn)里面沒有元素,則是查找到盡頭都沒找到if not li :return Falsemid = len(li)//2 #mid記錄li的中間位置#檢查一下 如果中間這個數(shù)就是要找的元素 返回真if li[mid] == item :return True# 如果mid比item大,說明item可能會出現(xiàn)在mid左邊,對左邊再查找elif li[mid]> item :return merge_search( li[:mid] ,item )# mid 比item小,說明item有可能在mid右邊,對右邊再查找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 還沒錯開 就一直找while start <= end :#通過計算獲取當前查找范圍的中間位置mid = (start + end)//2#如果中間數(shù)就是item則返回Trueif li[mid] == item :return True#如果mid比item大,說明item可能會出現(xiàn)在mid左邊,對左邊再查找elif li[mid]> item :end = mid - 1# mid 比item小,說明item有可能在mid右邊,對右邊再查找else :start = mid + 1#跳出循環(huán)說明沒找到 返回錯誤return Falseif __name__ == '__main__':li = [1,2,3,4,5,6,7,8]print( merge_search(li , 8) ) #Trueprint( merge_search(li , 0) ) #False
?算法題:
兩個乒乓球隊進行比賽,各出三人。甲隊為a,b,c三人,乙隊為x,y,z三人。已抽簽決定比賽名單。有人向隊員打聽比賽的名單。a說他不和x比,c說他不和x,z比,請編程序找出三隊賽手的名單。
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]))?
求一個字符串最長不重復(fù)子串
#!/usr/bin/python # -*- coding:utf-8 -*-def max_string(st):# 設(shè)置一個result list + 一個max# 考察的問題,如果對中間list 進行截取,這個時候要考慮,我截取完的list# 要將新數(shù)據(jù)append進去,然后在去求一下,長度和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随笔