Skip to content

Commit 9cb435f

Browse files
author
bjweimengshu
committed
小灰灰
1 parent 19ce22a commit 9cb435f

File tree

8 files changed

+332
-2
lines changed

8 files changed

+332
-2
lines changed

src/chapter4/part3/QuickSort.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ def quick_sort(start_index, end_index, array=[]):
44
if start_index >= end_index:
55
return
66
# 得到基准元素位置
7-
pivot_index = partition_v2(start_index, end_index, array)
7+
pivot_index = partition_v1(start_index, end_index, array)
88
# 根据基准元素,分成两部分递归排序
99
quick_sort(start_index, pivot_index - 1, array)
1010
quick_sort(pivot_index + 1, end_index, array)
@@ -39,7 +39,7 @@ def partition_v2(start_index, end_index, array=[]):
3939
mark = start_index
4040
for i in range(start_index+1, end_index+1):
4141
if array[i] < pivot:
42-
mark +=1
42+
mark += 1
4343
p = array[mark]
4444
array[mark] = array[i]
4545
array[i] = p
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
def big_number_sum(big_number_a, big_number_b):
2+
# 把两个大整数用数组逆序存储,数组长度等于较大整数位数 + 1
3+
max_length = len(big_number_a) if len(big_number_a)> len(big_number_b) else len(big_number_b)
4+
big_number_a = big_number_a.zfill(max_length)
5+
big_number_b = big_number_b.zfill(max_length)
6+
array_a = list(big_number_a)
7+
array_b = list(big_number_b)
8+
# 2.构建result数组,数组长度等于较大整数位数 + 1
9+
result = [0] * (max_length + 1)
10+
# 3.遍历数组,按位相加
11+
for i in range(max_length-1, -1, -1):
12+
temp = result[i+1]
13+
temp += int(array_a[i])
14+
temp += int(array_b[i])
15+
# 判断是否进位
16+
if temp >= 10:
17+
temp = temp-10
18+
result[i] = 1
19+
result[i+1] = temp
20+
if result[0] == 0:
21+
result.pop(0)
22+
# 4.把result数组转成String
23+
result = [str(i) for i in result]
24+
result_str = "".join(result)
25+
return result_str
26+
27+
28+
print(big_number_sum("426709752318", "95481253129"))
29+

src/chapter5/part11/GoldMining.py

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
def get_best_gold_mining(w, n, p=[], g=[]):
2+
if w == 0 or n == 0:
3+
return 0
4+
if w < p[n-1]:
5+
return get_best_gold_mining(w, n-1, p, g)
6+
return max(get_best_gold_mining(w, n-1, p, g), get_best_gold_mining(w - p[n-1], n-1, p, g) + g[n-1])
7+
8+
9+
def get_best_gold_mining_v2(w, p=[], g=[]):
10+
result_table = [[0 for i in range(w+1)] for i in range(len(g)+1)]
11+
# 填充表格
12+
for i in range(1, len(g)+1):
13+
for j in range(1, w+1):
14+
if j < p[i-1]:
15+
result_table[i][j] = result_table[i-1][j]
16+
else:
17+
result_table[i][j] = max(result_table[i-1][j], result_table[i-1][j-p[i-1]]+ g[i-1])
18+
# 返回最后一个格子的值
19+
return result_table[len(g)][w]
20+
21+
22+
def get_best_gold_mining_v3(w, p=[], g=[]):
23+
# 创建当前结果
24+
results = [0]*(w+1)
25+
# 填充一维数组
26+
for i in range(1, len(g)+1):
27+
for j in range(w, 0, -1):
28+
if j >= p[i-1]:
29+
results[j] = max(results[j], results[j-p[i-1]] + g[i-1])
30+
# 返回最后一个格子的值
31+
return results[w]
32+
33+
34+
test_w = 10
35+
test_p = list([5, 5, 3, 4, 3])
36+
test_g = list({400, 500, 200, 300, 350})
37+
print("最优收益:", get_best_gold_mining_v2(test_w, test_p, test_g))
38+

src/chapter5/part12/FindLostNum.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
def find_lost_num(array=[]):
2+
# 用于存储两个出现奇数次的整数
3+
result = [0, 0]
4+
# 第一次整体异或
5+
xor_result = 0
6+
for i in range(0, len(array)):
7+
xor_result ^= array[i]
8+
# 如果异或结果为0,说明输入数组不符合题目
9+
if xor_result == 0:
10+
return None
11+
# 确定两个整数的不同位,以此来做分组
12+
separator = 1
13+
while 0 == (xor_result & separator):
14+
separator <<= 1
15+
# 第二次分组异或
16+
for i in range(0, len(array)):
17+
if 0 == (array[i] & separator):
18+
result[0] ^= array[i]
19+
else:
20+
result[1] ^= array[i]
21+
return result
22+
23+
24+
my_array = list([4, 1, 2, 2, 5, 1, 4, 3])
25+
print(find_lost_num(my_array))
26+
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
def find_nearest_number(numbers=[]):
2+
# 1.从后向前查看逆序区域,找到逆序区域的前一位,也就是数字置换的边界
3+
index = find_transfer_point(numbers)
4+
# 如果数字置换边界是0,说明整个数组已经逆序,无法得到更大的相同数字组成的整数,返回null
5+
if index == 0:
6+
return None
7+
8+
# 2.把逆序区域的前一位和逆序区域中刚刚大于它的数字交换位置
9+
# 拷贝入参,避免直接修改入参
10+
numbers_copy = numbers.copy()
11+
exchange_head(index, numbers_copy)
12+
# 3.把原来的逆序区域转为顺序
13+
reverse(index, numbers_copy)
14+
return numbers_copy
15+
16+
17+
def find_transfer_point(numbers=[]):
18+
for i in range(len(numbers)-1, 0, -1):
19+
if numbers[i] > numbers[i-1]:
20+
return i
21+
return 0
22+
23+
24+
def exchange_head(index, numbers=[]):
25+
head = numbers[index-1]
26+
for i in range(len(numbers)-1, 0, -1):
27+
if head < numbers[i]:
28+
numbers[index-1] = numbers[i]
29+
numbers[i] = head
30+
break
31+
return numbers
32+
33+
34+
def reverse(index, numbers=[]):
35+
i = index
36+
j = len(numbers)-1
37+
while i < j:
38+
temp = numbers[i]
39+
numbers[i] = numbers[j]
40+
numbers[j] = temp
41+
i += 1
42+
j -= 1
43+
return numbers
44+
45+
46+
def output_numbers(numbers=[]):
47+
for i in numbers:
48+
print(i, end='')
49+
print()
50+
51+
52+
my_numbers = list([1, 2, 3, 4, 5])
53+
# 打印12345之后的10个全排列整数
54+
for k in range(0, 10):
55+
my_numbers = find_nearest_number(my_numbers)
56+
output_numbers(my_numbers)
57+
58+
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
def remove_k_digits(num, k):
2+
for i in range(0, k):
3+
has_cut = False
4+
# 从左向右遍历,找到比自己右侧数字大的数字并删除
5+
for j in range(0, len(num)-1):
6+
if num[j] > num[j+1]:
7+
num = num[0:j]+num[j+1:len(num)]
8+
has_cut = True
9+
break
10+
# 如果没有找到要删除的数字,则删除最后一个数字
11+
if not has_cut:
12+
num = num[0:len(num)-1]
13+
# 清除整数左侧的数字0
14+
for j in range(0, len(num)-1):
15+
if num[0] != '0':
16+
break
17+
num = num[1:len(num)]
18+
# 如果整数的所有数字都被删除了,直接返回0
19+
if len(num) == 0:
20+
return "0"
21+
return num
22+
23+
24+
def remove_k_digits_v2(num, k):
25+
# 新整数的最终长度 = 原整数长度 - k
26+
new_length = len(num) - k
27+
# 创建一个栈,用于接收所有的数字
28+
stack = []
29+
for i in range(0, len(num)):
30+
# 遍历当前数字
31+
c = num[i]
32+
# 当栈顶数字大于遍历到的当前数字,栈顶数字出栈(相当于删除数字)
33+
while len(stack) > 0 and stack[len(stack)-1] > c and k > 0:
34+
stack.pop()
35+
k -= 1
36+
# 如果遇到数字0,且栈为空,0不入栈
37+
if '0' == c and len(stack) == 0:
38+
new_length -= 1
39+
if new_length <= 0:
40+
return "0"
41+
continue
42+
# 遍历到的当前数字入栈
43+
stack.append(c)
44+
# 找到栈中第一个非零数字的位置,以此构建新的整数字符串
45+
if new_length <= 0:
46+
return "0"
47+
return "".join(stack)
48+
49+
50+
print(remove_k_digits("1593212", 3))
51+
print(remove_k_digits("30200", 1))
52+
print(remove_k_digits("10", 2))
53+
print(remove_k_digits("541270936", 3))
54+
print(remove_k_digits("1593212", 4))

src/chapter6/part2/MyBitmap.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
class MyBitmap:
2+
def __init__(self, size):
3+
self.words = [0] * (self.get_word_index(size-1) + 1)
4+
self.size = size
5+
6+
def get_bit(self, bit_index):
7+
if bit_index < 0 or bit_index > self.size-1:
8+
return None
9+
word_index = self.get_word_index(bit_index)
10+
return (self.words[word_index] & (1 << bit_index)) != 0
11+
12+
def set_bit(self, bit_index):
13+
if bit_index < 0 or bit_index > self.size-1:
14+
return None
15+
word_index = self.get_word_index(bit_index)
16+
self.words[word_index] |= (1 << bit_index)
17+
18+
def get_word_index(self, bit_index):
19+
# 右移6位,相当于除以64
20+
return bit_index >> 6
21+
22+
23+
bitMap = MyBitmap(128)
24+
bitMap.set_bit(126)
25+
bitMap.set_bit(75)
26+
print(bitMap.get_bit(126))
27+
print(bitMap.get_bit(78))
28+
29+

src/chapter6/part3/LRUCache.py

Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
class LRUCache:
2+
def __init__(self, limit):
3+
self.limit = limit
4+
self.hash = {}
5+
self.head = None
6+
self.end = None
7+
8+
def get(self, key):
9+
node = self.hash.get(key)
10+
if node is None:
11+
return None
12+
self.refresh_node(node)
13+
return node.value
14+
15+
def put(self, key, value):
16+
node = self.hash.get(key)
17+
if node is None:
18+
# 如果key不存在,插入key-value
19+
if len(self.hash) >= self.limit:
20+
old_key = self.remove_node(self.head)
21+
self.hash.pop(old_key)
22+
node = Node(key, value)
23+
self.add_node(node)
24+
self.hash[key] = node
25+
else:
26+
# 如果key存在,刷新key-value
27+
node.value = value
28+
self.refresh_node(node)
29+
30+
def remove(self, key):
31+
node = self.hash.get(key);
32+
self.remove_node(node);
33+
self.hash.remove(key);
34+
35+
def refresh_node(self, node):
36+
# 如果访问的是尾节点,无需移动节点
37+
if node == self.end:
38+
return;
39+
# 移除节点
40+
self.remove_node(node);
41+
# 重新插入节点
42+
self.add_node(node);
43+
44+
def remove_node(self, node):
45+
if node == self.head and node == self.end:
46+
# 移除唯一的节点
47+
self.head = None
48+
self.end = None
49+
elif node == self.end:
50+
# 移除节点
51+
self.end = self.end.pre
52+
self.end.next = None
53+
elif node == self.head:
54+
# 移除头节点
55+
self.head = self.head.next
56+
self.head.pre = None
57+
else:
58+
# 移除中间节点
59+
node.pre.next = node.pre
60+
node.next.pre = node.pre
61+
return node.key
62+
63+
def add_node(self, node):
64+
if self.end is not None:
65+
self.end.next = node
66+
node.pre = self.end
67+
node.next = None
68+
self.end = node
69+
if self.head is None:
70+
self.head = node
71+
72+
73+
class Node:
74+
def __init__(self, key, value):
75+
self.key = key
76+
self.value = value
77+
self.pre = None
78+
self.next = None
79+
80+
81+
lruCache = LRUCache(5)
82+
lruCache.put("001", "用户1信息")
83+
lruCache.put("002", "用户2信息")
84+
lruCache.put("003", "用户3信息")
85+
lruCache.put("004", "用户4信息")
86+
lruCache.put("005", "用户5信息")
87+
print(lruCache.get("002"))
88+
lruCache.put("004", "用户2信息更新")
89+
lruCache.put("006", "用户6信息")
90+
print(lruCache.get("001"))
91+
print(lruCache.get("006"))
92+
93+
94+
95+
96+

0 commit comments

Comments
 (0)