Skip to content

Commit bd6a15a

Browse files
author
llame
committed
add
1 parent eb0efa8 commit bd6a15a

9 files changed

+316
-1
lines changed

README.md

+8-1
Original file line numberDiff line numberDiff line change
@@ -26,4 +26,11 @@
2626
#### 25-实现对一个字符串的所有排列
2727
#### 26-去除内嵌括号
2828
#### 27-求字符串的编辑距离
29-
29+
#### 28-如何实现字符串的匹配
30+
#### 29-求两个字符串的最长公共子串
31+
#### 31-如何求拿到最多金币的概率
32+
#### 32-如何求正整数n所有可能的整数组合
33+
#### 33-如何用一个随机函数得到另外一个随机函数
34+
#### 34-如何等概率地大小为n的数组中选取m个整数
35+
#### 35-如何组合1,2,5这三个数使其和为10036-如何判断还有几盏灯泡亮着
36+
#### 36-如何判断还有几盏灯泡亮着
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
# -*-coding:utf-8-*-
2+
"""
3+
@Author : llame
4+
@Software: PyCharm
5+
@Time : 2020/9/25 1:48 下午
6+
"""
7+
8+
#题目描述:给定主字符S与模式字符串P,判断P是否是S的子串,如果是,那么找出P在S中第一次出现的下标。
9+
def match(s, p):
10+
# 检查参数的合理性
11+
if s == None or p == None:
12+
print("参数不合理")
13+
return -1
14+
slen = len(s)
15+
plen = len(p)
16+
17+
# p肯定不是S的子串
18+
if slen < plen:
19+
return -1
20+
i = 0
21+
j = 0
22+
while i < slen and j < plen:
23+
if list(s)[i] == list(p)[j]:
24+
# 如果相同,那么继续比较后面的字符
25+
i += 1
26+
j += 1
27+
else:
28+
# 后退回去重新比较
29+
i = i - j + 1
30+
j = 0
31+
32+
if i > slen - plen:
33+
return -1
34+
# 匹配成功
35+
if j >= plen:
36+
return i - plen
37+
return -1
38+
39+
40+
if __name__ == "__main__":
41+
s = "xyzabcd"
42+
p = "abc"
43+
print(match(s, p))
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
# -*-coding:utf-8-*-
2+
"""
3+
@Author : llame
4+
@Software: PyCharm
5+
@Time : 2020/9/25 2:00 下午
6+
"""
7+
#题目描述:找出两个字符串的最长公共子串。例如:‘abccade’与字符串'dgcadde'的最长公共子串为'cad'.
8+
#动态规划
9+
10+
def getMaxSubStr(str1, str2):
11+
len1 = len(str1)
12+
len2 = len(str2)
13+
sb = ''
14+
maxs = 0 # 用来记录最长公共子串的长度
15+
maxI = 0 # 用来记录最长公共子串最后一个字符的位置
16+
# 申请新的空间来记录公共子串长度的信息
17+
M = [([None] * (len1 + 1)) for i in range(len2 + 1)]
18+
19+
i = 0
20+
while i < len1 + 1:
21+
M[i][0] = 0
22+
i += 1
23+
24+
j = 0
25+
while j < len2 + 1:
26+
M[0][j] = 0
27+
j += 1
28+
29+
# 通过利用递归公式填写新建的二维数组(公共字串的长度信息)
30+
i = 1
31+
while i < len1 + 1:
32+
j = 1
33+
while j < len2 + 1:
34+
if list(str1)[i - 1] == list(str2)[j - 1]:
35+
M[i][j] = M[i - 1][j - 1] + 1
36+
if M[i][j] > maxs:
37+
maxs = M[i][j]
38+
maxI = i
39+
else:
40+
M[i][j] = 0
41+
j += 1
42+
i += 1
43+
44+
# 找出公共字串
45+
i = maxI - maxs
46+
while i < maxI:
47+
sb = sb + list(str1)[i]
48+
i += 1
49+
50+
return sb
51+
52+
53+
if __name__ == "__main__":
54+
str1 = "abccade"
55+
str2 = "dgcadde"
56+
print(getMaxSubStr(str1, str2))
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
# -*-coding:utf-8-*-
2+
"""
3+
@Author : llame
4+
@Software: PyCharm
5+
@Time : 2020/9/25 2:32 下午
6+
"""
7+
8+
# 题目描述:10个房间里放着数量随机的金币,每个房间只能进入一次,并且只能在一个房间中拿金币。
9+
# 一个人采取如下策略:前4个房间只看不拿,随后的房间只要看到比前4个房间都多的金币就拿,
10+
# 否者就拿最后一个房间的金币。编程计算这种策略拿到最多的金币的概率。
11+
12+
import random
13+
def getMaxNum(n):
14+
if n < 1:
15+
print("参数不合法")
16+
return
17+
18+
a = [None] * n
19+
# 随机生成n个房间里金币的个数
20+
i = 0
21+
while i < n:
22+
a[i] = random.uniform(1, n)
23+
i += 1
24+
25+
max4 = 0
26+
i = 0
27+
while i < 4:
28+
if a[i] > max4:
29+
max4 = a[i]
30+
i += 1
31+
i = 4
32+
while i < n - 1:
33+
if a[i] > max4:
34+
return True
35+
i += 1
36+
return False
37+
38+
39+
if __name__ == "__main__":
40+
monitorCount = 1000 + 0.0
41+
succes = 0
42+
i = 0
43+
while i < monitorCount:
44+
if getMaxNum(10):
45+
succes += 1
46+
i += 1
47+
print(succes / monitorCount)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
# -*-coding:utf-8-*-
2+
"""
3+
@Author : llame
4+
@Software: PyCharm
5+
@Time : 2020/9/25 3:12 下午
6+
"""
7+
8+
# 题目描述:给定一个正整数n,求解出所有和为n的整数组合,要求组合按照递增方式展示,而且唯一。
9+
# 例如4 =1+1+1+1,1+1+2, 1+3, 2+2, 4
10+
def GetAllConbin(n):
11+
if n == 2:
12+
return [[1,1],[2]]
13+
if n == 1:
14+
return [[1]]
15+
if n == 0:
16+
return
17+
result = []
18+
for i in range(n):
19+
tmp = GetAllConbin(n-i-1) # 得到的tmp是一个二维数组,数组里的每一个元素都是一个数组,该数组各个元素之和为n-1.
20+
if tmp == None:
21+
pass
22+
else:
23+
lens = len(tmp) - 1
24+
j = 0
25+
while lens-j >= 0:
26+
if tmp[lens - j][0] >= (i+1):
27+
tmp[lens - j].insert(0 , (i + 1))
28+
else:
29+
del tmp[lens - j]
30+
j += 1
31+
result.extend(tmp)
32+
result.extend([[n]])
33+
return result
34+
35+
if __name__ == "__main__":
36+
result = GetAllConbin(4)
37+
print(result)
38+
39+
[[1, 1, 1, 1], [1, 1, 2], [1, 1], [1, 3], [1, 1], [2, 2], [1], [4]]
40+
[[1, 1, 1, 1], [1, 1, 2], [1, 1], [1, 3], [1, 1], [2, 2], [1], [4]]
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
# -*-coding:utf-8-*-
2+
"""
3+
@Author : llame
4+
@Software: PyCharm
5+
@Time : 2020/9/25 3:56 下午
6+
"""
7+
# 题目描述:有一个函数func1能返回0和1两个值,返回0和1的概率都1/2,
8+
# 问怎么利用这个函数得到另外一个函数func2, 使func2也只能返回0和1,
9+
# 且返回的概率为1/4,返回1的概率为3/4.
10+
11+
import random
12+
def get_random():
13+
a=int(round(random.random()))
14+
return a
15+
16+
def get_random_1():
17+
a=get_random()
18+
b=get_random()
19+
if a+b==2:
20+
return 0
21+
else:
22+
return 1
23+
24+
if __name__ == '__main__':
25+
times=1000000
26+
zero_number=0
27+
28+
i=0
29+
while(i<times):
30+
tmp=get_random_1()
31+
if tmp==0:
32+
zero_number+=1
33+
i+=1
34+
35+
print('zero ratio:',zero_number/times)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
# -*-coding:utf-8-*-
2+
"""
3+
@Author : llame
4+
@Software: PyCharm
5+
@Time : 2020/9/25 4:18 下午
6+
"""
7+
8+
# 题目描述:随机的从大小为n的数组中选取m个整数,要求每个元素被选中的概率相等。
9+
def get_random(arr,m):
10+
import random
11+
length=len(arr)
12+
13+
i=0
14+
while(i<m):
15+
random_int=random.randint(i,length-1)
16+
tmp=arr[i]
17+
arr[i]=arr[random_int]
18+
arr[random_int]=tmp
19+
i=i+1
20+
return arr[0:m]
21+
22+
if __name__ == '__main__':
23+
arr=[1,1,3,4,5,6,7,8,9,10]
24+
choose=get_random(arr,5)
25+
print('choose',choose)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
# -*-coding:utf-8-*-
2+
"""
3+
@Author : llame
4+
@Software: PyCharm
5+
@Time : 2020/9/25 4:36 下午
6+
"""
7+
def combinationCount(n):
8+
number=0
9+
for i in range(0,n+1):
10+
for j in range(0,(n-i)//2+1):
11+
for k in range(0,(n-i-2*j)//5+1):
12+
if i+2*j+5*k==n:
13+
number+=1
14+
print(number)
15+
return number
16+
17+
18+
if __name__ == "__main__":
19+
print(combinationCount(100))
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
# -*-coding:utf-8-*-
2+
"""
3+
@Author : llame
4+
@Software: PyCharm
5+
@Time : 2020/9/25 5:25 下午
6+
"""
7+
8+
# 1.对于每盏灯,当拉动的次数是奇数时,灯就是亮着的,当拉动的次数是偶数时,灯就是关着的。
9+
# 2.每盏灯拉动的次数与它的编号所含的约数的个数有关,它的编号有几个约数,这盏灯就被拉动几次。
10+
11+
def factorIsOdd(a):
12+
total = 0
13+
i = 1
14+
while i <= a:
15+
if a % i == 0:
16+
total += 1
17+
i += 1
18+
19+
if total % 2 == 1:
20+
return 1
21+
else:
22+
return 0
23+
24+
25+
def totalCount(num, n):
26+
count = 0
27+
i = 0
28+
while i < n:
29+
if factorIsOdd(num[i]) == 1:
30+
print("亮着的灯的编号是:" + str(num[i]))
31+
count += 1
32+
i += 1
33+
return count
34+
35+
36+
if __name__ == "__main__":
37+
num = [None] * 100
38+
i = 0
39+
while i < 100:
40+
num[i] = i + 1
41+
i += 1
42+
count = totalCount(num, 100)
43+
print("最后总共有" + str(count) + "盏灯亮着。")

0 commit comments

Comments
 (0)