思想,每次隨機取乙個數,將大於其的放在右邊,小於或等於其的放在左邊,如此遞迴
def
quicksort
(arr):if
len(arr)
<=1or
len(
list
(filter
(lambda a:a==arr[0]
,arr)))
==len
(arr)
:return arr
middle = random.choice(
range
(len
(arr)))
left =
right =
for i, num in
enumerate
(arr)
:if num <= arr[middle]
:elif num > arr[middle]
: left = quicksort(left)
right = quicksort(right)
left.extend(right)
return left
其他實現方法
思想:使用字典型別存貯key,node,node存的是雙向鍊錶的引用,在雙向鍊錶中存貯value,當get 或者 put時,將該node放在雙向鍊錶的頭部,若put時超出size,則將末尾的node刪除。
class
lrucache
(object):
def__init__
(self, size:
int)
: self.size = size
self.cache =
self.head =
none
self.tail =
none
defget
(self, key:
str)
: node = self.cache.get(key)
self.head.deletenode(node)
self.head = node
return self.head
defput(self, key, value)
: node = dulinklist(value)
if self.head is
none
: self.head = node
self.tail = key
self.cache[key]
= node
return self.head
print
('len'
,len
(self.cache.keys())
)iflen(self.cache.keys())
>= self.size:
last = self.head.delete(
) last_key =
filter
(lambda item: last == item[1]
, self.cache.items())
last_key =
list
(last_key)[0
][0]
del self.cache[last_key]
# del self.cache[last.value]
self.head = node
self.cache[key]
= node
return self.head
class
dulinklist
(object):
def__init__
(self, value)
: self.pre = self
self.value = value
self.
next
= self
# 新增乙個元素,放在最前面
def(self, node)
:# 最後乙個的下乙個是新插入的節點
self.pre.
next
= node
# 新插入節點的上乙個是最後乙個
node.pre = self.pre
# 現在節點的前面乙個是新插入的節點
self.pre = node
node.
next
= self
# 從末尾刪除乙個元素
defdelete
(self)
: last = self.pre
self.pre.pre.
next
= self
self.pre = self.pre.pre
return last
# 從雙向鍊錶中刪除乙個元素
defdeletenode
(self, node)
: node.
next
.pre = node.pre
node.pre.
next
= node.
next
defiterlru
(lru)
: node = lru.head
while node:
print
(node.value)
node = node.
next
if node is lru.head:
break
print
('-----'
)if __name__ ==
'__main__'
: lru = lrucache(5)
lru.put(1,
1)lru.put(2,
2)lru.put(3,
3)lru.put(4,
4)lru.put(5,
5)lru.get(3)
lru.get(4)
lru.put(6,
6)lru.put(7,
7)iterlru(lru)
class
tree
(object):
def__init__
(self, value)
: self.left =
none
self.value = value
self.right =
none
defcomparetree
(tree1, tree2)
:# 如果都為none,返回true
if tree1 is
none
and tree2 is
none
:return
true
# 如果不都為none,其中有乙個是none
if tree1 is
none
or tree2 is
none
:return
false
# 如果值相等
if tree1.value == tree2.value:
# 比較左子節點
left = comparetree(tree1.left, tree2.left)
# 比較右子節點
right = comparetree(tree1.right, tree2.right)
else
:return
false
# 如果左右子節點都相等
if left and right:
return
true
else
:return
false
if __name__ ==
'__main__'
: tree1 = tree(2)
tree1.left = tree(1)
tree1.right = tree(3)
tree2 = tree(2)
tree2.left = tree(1)
tree2.right = tree(3)
print
(comparetree(tree1,tree2)
)
面試演算法題總結 一
華為面試題 寫乙個程式,要求功能 求出用1 2 5 這三個數不同個數組合的和為100 的組合個數。如 100 個1 是乙個組合,5 個1 加19 個5 是乙個組合。請用c 語言寫。答案 最容易想到的演算法是 設x 是1 的個數,y 是2 的個數,z 是5 的個數,number 是組合數 注意到0 x...
面試演算法題
前幾天,一好友去筆試,有一題 現在有1000個蘋果,和10個箱子,如何把這1000個蘋果裝在這10個箱子裡,才能使不管任何數量 1 1000 的蘋果,都能一次給出?當時,我們都想,出題這人。今天,在想移位的時候,突然想到了,這絕對是二進位制數的變種。分析 1000個蘋果,最接近1024,轉化為2進製...
面試演算法題
1 直方圖矩形最大值 class solution s.push i return res 2 第n個醜數 class solution return res.back 3 lru cache 最近最少使用頁面置換快取器 class lrucache int get int key void set...